在 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");
}
}
我正在构建一个使用中央数据库的多线程系统。
我遇到的问题是我想创建固定大小的数据库连接。
我使用 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");
}
}