2017-12-21 3 views
0

좋은 아침,C3P0 하나 개의 서버에 여러 데이터베이스

제목이 내가 같은 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을 잡을 때마다 Connections의 새로운 전체 풀을 생성합니다. 이런 식으로 해보십시오.

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

내가 필요한 것입니다. 정말 고마워요! 나는 그것을 시도하고 완벽하게 작동합니다! –

관련 문제