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

如何在Java中重建丢失的KDB连接,java,kdb,q-lang,Java,Kdb,Q Lang,在我的Java应用程序中,我使用 private void initConnection() throws KException, IOException { conn = new c(host, port); conn.tz = TimeZone.getTimeZone(CONNECTION_TIMEZONE); } 然后我使用conn成功地在表中异步插入数据 KDB服务器每周重新启动一次,当服务器重置连接时,我收到一个异常java.net.SocketException 使

在我的Java应用程序中,我使用

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应用程序

你为什么不做一个

SELECT 1;
在你的连接上

如果它打开,它将运行。
如果它已关闭,则会由于网络连接失败而引发错误

您只能在kbd服务器计划重新启动的时刻运行此测试


就我个人而言,在重启kbd数据库的预定时刻,我会将数据转储到sqlite数据库中保存,然后在重启帧结束并重新建立连接时,将sqlite数据库的内容转储到kbd数据库中。

如果连接丢失,当您尝试点击KDB时,我希望
conn
对象抛出
IOException
或其后续对象

即,您应该捕获
IOException

  • 调用
    initConnection
    方法重新建立连接
  • 重新执行查询
  • 设置合理的重试阈值也不错。否则,如果KDb关闭,代码将继续尝试连接到它。

    此答案与安东·多夫琴科的上述答案相关(可能还会增加),但希望下面的内容也能帮助您

    如果我们看一下,我们可以看到下面
    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;
      }
      …
    }
    
    这将是尝试重新连接的一种方式;在一个挡块内。但是,要更详细地回答您的问题,请执行以下操作:

  • 要提醒应用程序的其余部分,请在catch块中执行此操作。执行此操作的一种方法是调用另一个回调方法来警告连接现在已关闭
  • 要重新连接,请在catch块中也执行此操作。不过,请注意仅在指定的时间间隔内执行此操作。我之所以提到这一点,是因为当Java应用程序尝试重新连接时,它将创建一个新的
    c
    对象

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

    您是否建议在每次插入之前执行SELECT 1?我正在短时间内处理数百万条记录,不希望每次插入前都执行SELECT 1。好吧,您的服务器每周在固定时间重置一次。因此,只需在服务器需要恢复的分钟内运行这些测试,并在其余时间忽略这些测试
    public boolean safeToRun(){if(ConnectionManager.isInStableMoment()){return select 1;}return true;}
    我个人会选择使用sqllite数据库在不稳定的分钟内加载数据,当数据库备份时,请将sqlite数据库清空到主数据库中。谢谢,这是一个很好的解决方案,同时,我引入了一个同步方法来检查连接是否与query conn.getConn().k(“1”);