首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Executors.withFixedSizePool中创建固定大小的数据库连接

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

Stack Overflow用户
提问于 2017-07-02 08:12:52
回答 1查看 923关注 0票数 0

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

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

我使用Executors.newFixedSizePool来创建与MAX_N相等的最大数量的池线程。

我正在使用execute函数执行我的线程,这是ExecutorService提供的。

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

所以我想要的是使用Executors.newFixedSizePool创建一个固定大小的池线程,这样每个池线程都有自己的数据库连接。如果池线程终止此连接,而如果构造了新的池线程,则还将构造一个新连接并将其链接到此池线程。

我在谷歌上搜索了一种方法,但没有发现任何有用的东西。有正确的方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-03 12:16:03

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

例如,如果使用BoneCP:

代码语言:javascript
复制
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");

    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44868731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档