0

我正在構建一個使用中央數據庫的多線程系統。在Executors.withFixedSizePool中創建固定大小的數據庫連接

我遇到的問題是我想創建一個固定大小的數據庫連接。

我使用Executors.newFixedSizePool來創建最大池池線程數量等於MAX_N

我使用execute函數執行我的線程ExecutorService

我想建立我的系統,只要這個池線程還活着,我的池中的每個池線程就會持有到數據庫的單個連接。所以,當我的線程在execute池中時,只有MAX_N連接到數據庫。另外,因爲Executors.newFixedSizePool關注了共享線程的數量,並且在它們中的一些由於異常而停止時創建新的線程,所以我希望同樣適用於我的數據庫連接。

所以我在找的是使用Executors.newFixedSizePool創建一個固定大小的池線程,每個池線程都有自己的數據庫連接。如果池化線程終止,則此連接關閉,並且如果構建了新的池化線程,則還將構建新的連接並將其鏈接到此池化線程。

我搜索了一種方法來做到這一點,但沒有找到有用的東西。有沒有一個正確的方法來做到這一點?

+0

是它是一個問題,如果你單獨創建一個連接池,當工人要求應該從連接獲取連接pool.I認爲,如果一個專用連接,那麼可能並不總是使用它。 –

+0

它不能解決我的問題。我需要連接數不變。例如,如果連接意外關閉,我想要創建一個新的連接。 –

+1

該任務將委託給連接池。請確保連接池大小應與池大小相同。如果它與線程關聯,則線程創建還包括連接創建時間。 –

回答

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"); 

    } 
}