时间序列数据库KDB 与Java结合使用介绍 -- 3 基于KDB JDBC的写入实现

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 ObjectPool 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(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 {

    @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);
    }
}

你可能感兴趣的:(Java)