KDB源代码里面也提供了KDB基于JDBC的实现,其实KDB的JDBC实现就是基于KDB 的底层c.java实现的封装,提供了面向JDBC的友好接口。不过我个人不倾向使用JDBC接口,很多功能并没有实现,比如说最重要的Batch功能,所有的sql必须一条一条执行。这里简单介绍一下如何使用JDBC访问KDB,通过Apache Commons Pool来缓存Socket 连接。
KDBJDBCService实现往KDB插入数据:
/** * */ 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 ObjectPoolpool; /** * 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
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 {
@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 wrap(final Connection con) {
return new DefaultPooledObject(con);
}
}