如何在Java中重新建立丢失的KDB连接

时间:2018-01-29 13:59:49

标签: java kdb q-lang

在我的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应用程序?

3 个答案:

答案 0 :(得分:2)

你为什么不做一个

SELECT 1;

你的连接。

如果它打开它会运行。
如果它关闭,它应该因为网络连接失败而抛出错误。

只有在kbd服务器计划重新启动的时刻才会运行此测试。

就个人而言,在重新启动kbd数据库的计划时刻,我会将数据转储到sqlite数据库中进行保存,然后当重新启动的框架结束并重新建立连接时,将sqlite数据库的内容转储到kbd数据库。

答案 1 :(得分:1)

如果连接丢失,当您尝试命中KDB时,我希望conn对象抛出IOException或其后继者。

即,你应该抓住IOException

  1. 调用initConnection方法重新建立连接
  2. 重新执行查询
  3. 设置合理的重试阈值也不错。否则,如果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;
  }
  …
}

那是尝试重新连接的一种方法;在一个捕获块中。但是,要更详细地回答您的问题:

  1. 要在其余应用程序中发出警报,请在catch块中发出警报。进行此操作的一种方法是调用另一种回调方法以警告连接现在已断开。
  2. 要重新连接,请在您的catch块中也执行此操作。但是请注意,只能按指定的时间间隔执行此操作。我之所以提到它,是因为当Java应用程序尝试重新连接时,它将创建一个新的c对象。

这应该有助于您的应用程序更有效地处理重新连接,并适当通知其他依赖项。