如何在Java中重建丢失的KDB连接
在我的Java应用程序中,我使用如何在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 使
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
方法重新建立连接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
对象这将有助于您的应用程序更有效地处理重新连接,并适当地通知任何其他依赖项。您是否建议在每次插入之前执行SELECT 1?我正在短时间内处理数百万条记录,不希望每次插入前都执行SELECT 1。好吧,您的服务器每周在固定时间重置一次。因此,只需在服务器需要恢复的分钟内运行这些测试,并在其余时间忽略这些测试
public boolean safeToRun(){if(ConnectionManager.isInStableMoment()){return select 1;}return true;}
我个人会选择使用sqllite数据库在不稳定的分钟内加载数据,当数据库备份时,请将sqlite数据库清空到主数据库中。谢谢,这是一个很好的解决方案,同时,我引入了一个同步方法来检查连接是否与query conn.getConn().k(“1”);