KDB源代码里面也提供了KDB基于JDBC的实现,其实KDB的JDBC实现就是基于KDB 的底层c.java实现的封装,提供了面向JDBC的友好接口。不过我个人不倾向使用JDBC接口,很多功能并没有实现,比如说最重要的Batch功能,所有的sql必须一条一条执行。这里简单介绍一下如何使用JDBC访问KDB,通过Apache Commons Pool来缓存Socket 连接。
KDBJDBCService实现往KDB插入数据:
</pre></p><p><pre name="code" class="java">/**
*
*/
package kx;
import java.sql.Connection;
import java.sql.PreparedStatement;
import lombok.extern.log4j.Log4j2;
import org.apache.commons.pool2.ObjectPool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
/**
* @author cloudlu
*
*/
@Log4j2
@Service
public class KDBJDBCService {
@Autowired
@Qualifier("jdbcPool")
private ObjectPool<Connection> pool;
/**
* insert data to specified table
*
* @param data
* : data object save to kdb
* @return
*/
public boolean insertKDBData(final KDBData data) {
Connection con = null;
try {
con = pool.borrowObject();
final PreparedStatement insert = con
.prepareStatement("q){`t insert 0N!a::x}");
insert.setTime(1, data.getTime());
insert.setString(2, data.getSym());
insert.setDouble(3, data.getPrice());
insert.setInt(4, data.getSize());
insert.setBoolean(5, data.isStop());
insert.setString(6, String.valueOf(data.getCond()));
insert.setString(7, String.valueOf(data.getEx()));
insert.executeUpdate();
return true;
} catch (final Exception e) {
LOG.error("fail to insert data", e);
} finally {
if (null != con) {
try {
pool.returnObject(con);
} catch (final Exception e) {
LOG.error("fail to return con back to poll", e);
}
}
}
return false;
}
}
@Qualifier("jdbcPool") 由spring注入: new GenericObjectPool<Connection>(new KDBJDBCPoolFactory()))
KDBJDBCPoolFactory实现缓存Socket连接:
package kx;
import java.sql.Connection;
import java.sql.DriverManager;
import org.apache.commons.pool2.BasePooledObjectFactory;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.DefaultPooledObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
public class KDBJDBCPoolFactory extends BasePooledObjectFactory<Connection> {
@Autowired
@Qualifier("ticketPlant")
private KDBServer server;
@Override
public Connection create() throws Exception {
Class.forName(JDBC.class.getName());
final Connection localConnection = DriverManager.getConnection(
"jdbc:q:" + server.getHost() + ":" + server.getPort(),
server.getUsername(), server.getPassword());
return localConnection;
}
@Override
public PooledObject<Connection> wrap(final Connection con) {
return new DefaultPooledObject<Connection>(con);
}
}
本文介绍了如何利用KDB的JDBC实现与Java进行交互,尽管KDB的JDBC接口不完全支持批量操作,但可以借助Apache Commons Pool来缓存Socket连接,以提高效率。内容涉及KDBJDBCService的使用,通过Spring注入`jdbcPool`来实现数据插入。

144

被折叠的 条评论
为什么被折叠?



