時系列データベースKDDBとJavaを組み合わせた使用説明--3 KDDB JDBCベースの書き込み実装

3562 ワード

KDBソースコードにはKDBベースのJDBC実装も提供されているが、実はKDBのJDBC実装はKDBベースの下位c.java実装のパッケージであり、JDBC向けのフレンドリーインタフェースを提供している.しかし、個人的にはJDBCインタフェースを使う傾向はありません.多くの機能は実現されていません.例えば、最も重要なBatch機能は、すべてのsqlが1つ1つ実行されなければなりません.ここではJDBCでKDDBにアクセスし、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);
    }
}