我正在构建一个使用中央数据库的多线程系统。
我遇到的问题是我想要创建一个固定大小的数据库连接。
我使用Executors.newFixedSizePool来创建与MAX_N相等的最大数量的池线程。
我正在使用execute函数执行我的线程,这是ExecutorService提供的。
我希望以一种方式构建我的系统,只要这个池线程还活着,我池中的每个池线程都有一个到数据库的连接。因此,当我在池中execute我的线程时,只有到数据库的MAX_N连接。此外,由于Executors.newFixedSizePool关注池线程的数量,如果其中一些线程由于异常而停止,则创建新线程,因此我希望数据库连接保持相同的线程数量。
所以我想要的是使用Executors.newFixedSizePool创建一个固定大小的池线程,这样每个池线程都有自己的数据库连接。如果池线程终止此连接,而如果构造了新的池线程,则还将构造一个新连接并将其链接到此池线程。
我在谷歌上搜索了一种方法,但没有发现任何有用的东西。有正确的方法吗?
发布于 2017-07-03 12:16:03
您应该使用Jdbc连接池。然后,从代码中需要连接到数据库的任何地方,只需从池获得到数据库的连接( connections将负责维护到数据库的所需连接数量)。
例如,如果使用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");
}
}https://stackoverflow.com/questions/44868731
复制相似问题