在Executors.withFixedSizePool中创建固定大小的数据库连接

时间:2017-07-02 08:12:53

标签: java multithreading database-connection executorservice

我正在建立一个使用中央数据库的多线程系统。

我遇到的问题是我想创建一个固定大小的数据库连接。

我使用Executors.newFixedSizePool创建了等于MAX_N的最大池化线程数。

我使用execute提供的ExecutorService功能执行我的主题。

我希望以这样一种方式构建我的系统:只要此池线程仍处于活动状态,池中的每个池线程都与数据库保持一个连接。因此,当我execute池中的线程时,数据库只有MAX_N个连接。此外,由于Executors.newFixedSizePool关注池化线程的数量,并且如果其中一些因异常而停止,则创建新的线程,我希望保持相同的数据库连接。

所以我正在寻找的是使用Executors.newFixedSizePool创建一个固定大小的池线程,每个池线程都有自己与数据库的连接。如果池化线程终止,则关闭此连接,如果构造了新的池化线程,则还会构造一个新连接并链接到该池化线程。

我用谷歌搜索了一个方法,但未找到任何有用的信息。有没有正确的方法来做到这一点?

1 个答案:

答案 0 :(得分:1)

您应该使用Jdbc连接池。然后从代码中需要连接到数据库的任何地方,只需从池中获取与数据库的连接(连接池将负责维护与数据库的所需连接数)

例如,如果您使用BoneCP:

import com.jolbox.bonecp.BoneCP;
import com.jolbox.bonecp.BoneCPConfig;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * <dependency>
 * <groupId>com.jolbox</groupId>
 * <artifactId>bonecp</artifactId>
 * <version>0.8.0.RELEASE</version>
 * </dependency>
 */
public class BoneCPexample {

    public static final int TOTAL_CONNECTIONS_TO_DATABASE = 20;

    public static void main(String[] args) throws SQLException {
        BoneCPexample boneCPexample = new BoneCPexample();
        boneCPexample.doTheWork();
    }

    private void doTheWork() throws SQLException {


        String jdbcUrlString = "jdbc:postgresql://localhost/test_database";  // jdbc:postgresql://host:port/database
        BoneCPConfig bcpConfig = new BoneCPConfig();
        bcpConfig.setJdbcUrl(jdbcUrlString);
        bcpConfig.setUsername("postgres");
        bcpConfig.setPassword("mi-password");
        bcpConfig.setPartitionCount(1);
        bcpConfig.setMinConnectionsPerPartition(TOTAL_CONNECTIONS_TO_DATABASE);
        bcpConfig.setMaxConnectionsPerPartition(TOTAL_CONNECTIONS_TO_DATABASE);
        bcpConfig.setConnectionTimeoutInMs(1 * 1000);
        bcpConfig.setDefaultAutoCommit(false);
        bcpConfig.setConnectionTestStatement("select now()");
        bcpConfig.setIdleConnectionTestPeriodInMinutes(5);


        BoneCP boneCP = new BoneCP(bcpConfig);
        Connection connection = boneCP.getConnection();

        Statement statement = connection.createStatement();
        statement.execute("select * from mytable");

    }
}
相关问题