2017-12-21 15 views
0

おはよう、C3P0 1台の複数のデータベース

タイトルは、接続プールを使用して同じMysqlサーバー上の異なるデータベースに接続するソリューションを作成したいとしています。私は、次の記事で示されている手順に従っている:

https://stackoverflow.com/questions/26785842/multiple-data-sources-for-c3p0

私のソリューションはこれです:

public class DatabaseUtility 
{ 
     public static ComboPooledDataSource getDataSource(String db, String user, String pass) throws PropertyVetoException 
     { 
       ComboPooledDataSource cpds = new ComboPooledDataSource(); 
       cpds.setJdbcUrl("jdbc:mysql://X.X.X.X:3306/"+db); 
       cpds.setUser(user); 
       cpds.setPassword(pass); 

       // Optional Settings 
       cpds.setInitialPoolSize(5); 
       cpds.setMinPoolSize(5); 
       cpds.setAcquireIncrement(5); 
       cpds.setMaxPoolSize(20); 
       cpds.setMaxStatements(100); 

       return cpds; 
     } 

     public static void main(String[] args) throws SQLException 
     { 
       Connection connection = null; 
       PreparedStatement pstmt = null; 
       ResultSet resultSet = null; 
       try 
       { 
         //QUERY to DATABASE 1 
         ComboPooledDataSource dataSource = DatabaseUtility.getDataSource("bd1", "user1", "pass1"); 
         connection = dataSource.getConnection(); 
         pstmt = connection.prepareStatement("SELECT * FROM municipio"); 

         System.out.println("The Connection Object is of Class: " + connection.getClass()); 

         resultSet = pstmt.executeQuery(); 
         while (resultSet.next()) 
         { 
           System.out.println(resultSet.getString(1) + "," + resultSet.getString(2) + "," + resultSet.getString(3)); 
         } 


         //QUERY to DATABASE 2 
         dataSource = DatabaseUtility.getDataSource("bd2", "user2", "pass2"); 
         connection = dataSource.getConnection(); 
         pstmt = connection.prepareStatement("SELECT * FROM alojamiento"); 

         System.out.println("The Connection Object is of Class: " + connection.getClass()); 

         resultSet = pstmt.executeQuery(); 
         while (resultSet.next()) 
         { 
           System.out.println(resultSet.getString(1) + "," + resultSet.getString(2) + "," + resultSet.getString(3)); 
         } 

       } 
       catch (Exception e) 
       { 
         connection.rollback(); 
         e.printStackTrace(); 
       } 
     } 
} 

私はデータベースに接続するたびに、私は特定の接続文字列を持つコンストラクタを呼び出します。

これは効率的なソリューションである、または私は何か間違ったことをやっている場合しかし、私は...

P.S.を疑問を持っています私はSpringを使わないプロジェクトを使用しています。

私はあなたのアドバイス、事前のおかげで、

挨拶をいただければ幸いです。

答えて

2

いいえ、これは間違いなく効率的な解決策ではありません。 Connectionを取得するたびに、Connectionの新しいプール全体を作成しています。このようなことを試してみてください。

private static ComboPooledDataSource createDataSource(String db, String user, String pass) { 
    ComboPooledDataSource cpds = new ComboPooledDataSource(); 
    cpds.setJdbcUrl("jdbc:mysql://X.X.X.X:3306/"+db); 
    cpds.setUser(user); 
    cpds.setPassword(pass); 

    // Optional Settings 
    cpds.setInitialPoolSize(5); 
    cpds.setMinPoolSize(5); 
    cpds.setAcquireIncrement(5); 
    cpds.setMaxPoolSize(20); 
    cpds.setMaxStatements(100); 

    return cpds; 
} 

private static final class DbUserPassword { 
    final String db; 
    final String user; 
    final String password; 

    DbUserPassword(String db, String user, String password) { 
     this.db = db; 
     this.user = user; 
     this.password = password; 
    } 

    @Override 
    public boolean equals(Object o) { 
     if (o instanceof DbUserPassword) { 
      DbUserPassword that = (DbUserPassword) o; 
      return (this.db.equals(that.db) && this.user.equals(that.user) && this.password.equals(that.password)); 
     } 
     else { 
      return false; 
     } 
} 

    @Override 
    public int hashCode() { 
     return db.hashCode()^user.hashCode()^password.hashCode(); 
    } 

} 

// MT: protected by class' lock 
private static HashMap<DbUserPassword,ComboPooledDataSource> poolMap = new HashMap<>(); 

public static synchronized ComboPooledDataSource getDataSource(String db, String user, String pass) { 
    DbUserPassword dbup = new DbUserPassword(db, user, pass); 
    ComboPooledDataSource out = poolMap.get(dbup); 
    if (out == null) { 
     out = createDataSource(db, user, pass); 
     poolMap.put(dbup, out); 
    } 
    return out; 
} 
+0

本当にありがとうございます!私はそれを試して、それは完全に動作します! –

関連する問題