我正在建立一个使用中央数据库的多线程系统。
我遇到的问题是我想创建一个固定大小的数据库连接。
我使用Executors.newFixedSizePool
创建了等于MAX_N
的最大池化线程数。
我使用execute
提供的ExecutorService
功能执行我的主题。
我希望以这样一种方式构建我的系统:只要此池线程仍处于活动状态,池中的每个池线程都与数据库保持一个连接。因此,当我execute
池中的线程时,数据库只有MAX_N
个连接。此外,由于Executors.newFixedSizePool
关注池化线程的数量,并且如果其中一些因异常而停止,则创建新的线程,我希望保持相同的数据库连接。
所以我正在寻找的是使用Executors.newFixedSizePool
创建一个固定大小的池线程,每个池线程都有自己与数据库的连接。如果池化线程终止,则关闭此连接,如果构造了新的池化线程,则还会构造一个新连接并链接到该池化线程。
我用谷歌搜索了一个方法,但未找到任何有用的信息。有没有正确的方法来做到这一点?
答案 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");
}
}