我有一些使用 Java Domino API(使用 NCSO.jar)通过 IIOP 与 Domino 数据库连接的 Java 代码。现在的一个新要求是,如果正在连接的服务器是集群的,那么应该可以利用这一点并在当前连接的服务器出现故障时切换到集群中的故障转移服务器。
不幸的是,Domino Java API 完全是晦涩难懂的,在本地和通过 IIOP 远程使用 API 之间存在细微差别,很少有真正清晰的解释和奇怪的差异,具体取决于您为方法提供的参数。
我设法从这里收集到的一些信息...... openWithFailoverMethod 是否有效?
我还查看了 IBM 信息中心上的文档。
我尝试的第一件事是:
Session session = NotesFactory.createSession(host + ":" + port, user, password);
Database db = session.getDatabase(null, databaseName, false);
db.openWithFailover(host, databaseName);
的第一个参数getDatabase
,服务器名称,对于 IIOP 操作显然必须为 null。当它已经在会话中时,如何有必要在openWithFailover
方法中再次指定服务器名称,我对此感到相当困惑,但我想您可以使用会话连接到集群,然后在 open 方法中指定主服务器。但是,为什么您需要提供两次数据库名称并不十分清楚。最后一个参数表明如果无法访问数据库,则不应创建数据库(省略它,默认为 true;多么美妙)。
不幸的是,这在我脸上吐出了异常NotesException: This database object is already open as E:\Lotus\Domino\data\mail-in\EDITEST.nsf
。它发生在openWithFailover
方法上。
显然,第一次调用getDatabase
已经打开它,并且没有关闭方法或仅获取对象而不实际打开它的选项。该类Database
是一个接口,因此没有获取此类对象的静态方法或实例化它的方法。我检查了一下,发现唯一的选择是openDatabase
在课堂上使用DbDirectory
。猜猜这是做什么的。现在该方法确实有一个带有布尔值的替代方法,它表明您是否希望使用故障转移,但根据文档,对于 IIOP 操作它总是错误的。
根据this page ,您可以通过使用两个空参数调用来获取一个空Database
对象。getDatabase
所以我尝试了这个:
Session session = NotesFactory.createSession(host + ":" + port, user, password);
Database db = session.getDatabase(null, null, false);
db.openWithFailOver(host, databaseName);
哪个及时给了我例外NotesException: A database name must be provided
。将第二行更改为Database db = session.getDatabase(null, null);
没有任何区别。
我只能假设远程操作必须使用数据库名称?但是,远程连接时如何使用故障转移呢?还是我做错了?也许我应该连接到集群而不是服务器本身,并且故障转移会自动处理?或者远程连接显然不可能进行故障转移?Notes 客户端可以做到这一点,所以我希望它可以在您自己的 Java 代码中实现。
有人请在这里帮助我,因为文档没有提供足够的信息。