多线程Java程序中的连接池

时间:2015-02-04 16:12:07

标签: java multithreading oracle connection-pooling

我有一个使用ExecutorService(15个线程)进行多线程的java进程。每个线程都调用存储过程将数据插入到表中,我的连接要汇总到15个线程,以便我可以同时在表上看到多个提交,但我只看到为一个活动线程建立了一个连接,即使是15个线程也是如此准备好等待。

尝试使用以下代码建立连接并汇集所有线程

Class.forName(DB_DRIVER);

DataSource oracleDataSource = new DriverManagerDataSource(DB_CONNECTION, DB_USER,DB_PASSWORD);

ObjectPool objectPool = new GenericObjectPool();

DataSourceConnectionFactory datasourceConnectionFactory = new DataSourceConnectionFactory(oracleDataSource);

PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(datasourceConnectionFactory, objectPool, null, null, false, true);

objectPool.setFactory(poolableConnectionFactory);

PoolingDataSource datasource = new PoolingDataSource(objectPool); 

但它还没有奏效。我的线程仍然只使用一个连接,其他线程正在等待活动的线程完成。

1 个答案:

答案 0 :(得分:1)

您可以在类中封装与DB的连接,并自己创建此类的对象池。

实施例

class Connection {
//  your DB connection specific stuff
public void open() {
//  open connection
}

public void close() {
// close connection
}

public void isOpen() {
//  is the connection being opened by any thread already
}
}

一旦你有了这个,创建一个线程安全的方法,它将下一个可用的连接对象返回给任何请求线程。

class ConnectionController {
public Connection getConnection() {
//  return the next available connection object by checking which 
//connection object is not open by checking return value of isOpen
}
}

确保在完成后关闭连接! 希望它有所帮助。