多线程Java程序中的Oracle DB连接池

时间:2015-02-03 21:03:55

标签: java multithreading oracle jdbc connection-pooling

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

驱动程序: oracle.jdbc.driver.OracleDriver

以下是我的属性文件中的连接详细信息 网址,用户名,密码

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)

2 个答案:

答案 0 :(得分:2)

Oracle具有通用连接池(ucp.jar),它易于使用且来自oracle。您只需要在类路径中包含ucp.jar以及ojdbc6.jar或ojdbc7.jar。

请参阅UCP参考指南:http://docs.oracle.com/database/121/JJUCP/toc.htm

PoolDataSource pds = PoolDataSourceFactory.getPoolDataSource();
pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
pds.setMinPoolSize(10);
pds.setMaxPoolSize(50);
Connection conn=pds.getConnection(); 

答案 1 :(得分:1)

您需要一个连接池。

管理执行程序池的对象将检出连接,将其提供给ExecutorService,并在任务完成时关闭它,或者ExecutorService将对其进行管理。确保您仔细关注连接管理和SQL资源清理,否则在高请求量下您很快就会遇到问题。

通常它是为您管理连接池的Java EE应用服务器,但听起来您并没有使用它。如果这是真的,也许Apache Database Connection Pool将符合您的目的。