在我的Java应用程序中,我正在使用
建立KDB连接private void initConnection() throws KException, IOException {
conn = new c(host, port);
conn.tz = TimeZone.getTimeZone(CONNECTION_TIMEZONE);
}
然后我使用conn
成功地在表中异步插入数据。
KDB服务器每周重启一次,当时由服务器重置连接我收到例外java.net.SocketException
。
使用上面的异常,我可以再次重新建立丢失的连接,但这不是一个像样的解决方案,因为我丢失批处理等,我不希望在插入时抛出连接异常。
相反,KDB API中是否有回调/侦听器/异常方法,如果连接被服务器/丢失关闭,API可以提前通知java应用程序?
答案 0 :(得分:2)
你为什么不做一个
SELECT 1;
你的连接。
如果它打开它会运行。
如果它关闭,它应该因为网络连接失败而抛出错误。
只有在kbd服务器计划重新启动的时刻才会运行此测试。
就个人而言,在重新启动kbd数据库的计划时刻,我会将数据转储到sqlite数据库中进行保存,然后当重新启动的框架结束并重新建立连接时,将sqlite数据库的内容转储到kbd数据库。
答案 1 :(得分:1)
如果连接丢失,当您尝试命中KDB时,我希望conn
对象抛出IOException
或其后继者。
即,你应该抓住IOException
和
initConnection
方法重新建立连接设置合理的重试阈值也不错。否则,如果KDb关闭,代码将继续尝试连接到它。
答案 2 :(得分:0)
此答案与(上面可能回答的)安东·多夫任科(Anton Dovzhenko)有关,但希望以下内容对您有所帮助。
如果我们看一下kx's documentation for reconnecting to a q process automatically,可以观察到下面ReconnectionExample.java
的以下代码段。
//initiate reconnect loop (possibly within a catch block).
while (true) {
try {
System.err.println("Connection failed - retrying..");
//Wait a bit before trying to reconnect
Thread.sleep(5000);
qConnection = qConnFactory.getQConnection();
System.out.println("Connection re-established! Resuming..");
//Exit loop
break;
} catch (IOException | KException e1) {
//resume loop if it fails
continue;
}
…
}
那是尝试重新连接的一种方法;在一个捕获块中。但是,要更详细地回答您的问题:
c
对象。这应该有助于您的应用程序更有效地处理重新连接,并适当通知其他依赖项。