【问题标题】:Connection Pooling in Multi Threaded Java Program多线程 Java 程序中的连接池
【发布时间】:2015-02-04 16:12:06
【问题描述】:

我有一个使用 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); 

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

【问题讨论】:

    标签: java multithreading oracle connection-pooling


    【解决方案1】:

    您可以将与数据库的连接封装在一个类中,并自己创建一个该类的对象池。

    例子

    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
    }
    }
    

    完成后请确保关闭连接! 希望对您有所帮助。

    【讨论】:

    • 您能否详细说明一下连接对象池。
    猜你喜欢
    • 2013-05-23
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    相关资源
    最近更新 更多