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

Create fixed size of database connection inside Executors.withFixedSizePool

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

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

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

我正在使用 ExecutorService 可用的 execute 函数执行我的线程。

我想构建我的系统,只要该池线程仍然存在,我的池中的每个池线程都保持与数据库的单一连接。因此,当我 execute 我的线程在池中时,只有 MAX_N 连接到数据库。此外,由于 Executors.newFixedSizePool 关注池线程的数量,如果其中一些线程因异常而停止,则会创建新线程,因此我希望对我的数据库连接保持相同的状态。

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

我用谷歌搜索了一种方法,但没有找到任何有用的信息。有正确的方法吗?

您应该使用 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");

    }
}