2016-05-10 5 views
-1

スタンドアロンアプリケーションのjdbc接続を取得するためにシングルトンパターンを使用しました。コードは次のとおりです。シングルトンはJDBC接続を取得するには適していませんか?接続プーリングの良い実装ですか?

public static synchronized MysqlConnect getDbCon() { 
    if (db == null) { 
     db = new MysqlConnect(); 
    } 
    return db; 
} 

しかし、私は多くの議論でシングルトンが接続を得意ではないことに気付きました。本当ですか? 推奨する接続プールを使用してください。誰も私に上記のコードの代わりに接続プーリングの良い実装を与えることができますか?

+1

"JDBC Connection Pooling"のインターウェブを検索しましたか? –

答えて

0

シンプルなシングルトンベースの接続プールの実装です。この接続プールは、DriverManagerインタフェースまたはDataSource(JNDI)を使用した接続の取得をサポートします。彼らは、ライブラリの一部として書かれているので、いくつかの方法は、(パブリックアクセスを持っていない

public class ConnectionPool{ 
private String jdbcDriver; 
private String jdbcURL; 
private String user; 
private String password; 
private int connectionCount=10; 
private List<Connection> connections; 
private static boolean loadFromDataSource; 
private static DataSource dataSource; 
private static ConnectionPool connPool; 


private ConnectionPool() throws EasyORMException{} 

private void setConnection(String jdbcDriver, String jdbcURL, String user, String password,String dbDataSource) throws EasyORMException{ 

    this.jdbcDriver = jdbcDriver; 
    this.jdbcURL=jdbcURL; 
    this.user=user; 
    this.password=password; 

    connections= new ArrayList<Connection>(); 
    connections.add((ConnectionPool.loadFromDataSource) ? getConnectionFromDataSource() : getConnection());  
} 
static ConnectionPool getInstance(){ 
    return connPool; 
} 
private static ConnectionPool getInstanceFromJndi(String propertyFile,boolean loadFromJndi) throws EasyORMException{ 
    ConnectionProp cp=readPropFromFile(propertyFile); 

    if(loadFromJndi){ 
     dataSource=createDatasource(cp.getDataSource()); 
     loadFromDataSource=true;    
    } 
    return ConnectionPool.createConnectionPool(cp.getJdbcDriver(),cp.getDbURL(), cp.getUsername(), cp.getPassword(),cp.getDataSource()) 
} 
public static ConnectionPool getInstance(String propertyFile,boolean loadFromJndi) throws EasyORMException{ 

    return ConnectionPool.getInstanceFromJndi(propertyFile, loadFromJndi, false); 
} 

public static ConnectionPool getInstance(ConnectionProp cp) throws EasyORMException{ 
    return ConnectionPool.createConnectionPool(cp.getJdbcDriver(),cp.getDbURL(), cp.getUsername(), cp.getPassword(),cp.getDataSource()); 
} 
public static ConnectionPool getInstance(String jndiName) throws EasyORMException{ 

    dataSource=createDatasource(jndiName); 
    loadFromDataSource=true; 
    return ConnectionPool.createConnectionPool(null,null, null, null,jndiName); 
} 
public static ConnectionPool getInstance(String jdbcDriver, String jdbcURL, String user, String password) throws EasyORMException{ 

    return ConnectionPool.createConnectionPool(jdbcDriver,jdbcURL, user, password,null); 
} 
private static ConnectionPool createConnectionPool(String jdbcDriver, String jdbcURL, String user, String password,String dbDataSource) throws EasyORMException{ 
    if(connPool==null) { 
     connPool = new ConnectionPool(); 
     connPool.setConnection(jdbcDriver, jdbcURL, user, password, dbDataSource); 
    } 
    return connPool; 
} 

synchronized Connection getAvailableConnection() throws EasyORMException { 
    Connection conn=null; 
    int connSize = connections.size(); 
    if(connSize>0){ 
     conn=connections.remove(connSize-1); 
    }else{ 
     if(connSize<connectionCount){ 
      for(int i=0;i<initialConnCount;i++) 
       conn=(ConnectionPool.loadFromDataSource)?getConnectionFromDataSource() :getConnection(); 
     }else{ 
       throw new EasyORMException(EasyORMException.CONNECTION_NUM_EXCEEDED); 
      } 
    } 
    return conn; 
} 

synchronized void returnConnection(Connection conn){ 
    connections.add(conn); 
} 


private Connection getConnection() throws EasyORMException { 

    Connection conn=null; 
    try { 
     Class.forName(jdbcDriver); 
     conn = DriverManager.getConnection(jdbcURL, user, password); 
    } catch (ClassNotFoundException e) { 
     throw new EasyORMException(e); 
    } catch (SQLException e) { 
     throw new EasyORMException(e); 
    } 

    return conn; 
} 
private Connection getConnectionFromDataSource() throws EasyORMException { 
    try{ 
     return dataSource.getConnection(); 
    }catch(SQLException e){ 
     throw new EasyORMException(e); 
    } 
} 

public void setNumberOfConnections(int count){ 
    this.connectionCount=count; 
} 
public int getNumberOfConnections(){ 
    return connectionCount; 
} 
private static DataSource createDatasource(String jndiDb)throws EasyORMException{ 
    InitialContext initCtx=null; 
    try { 
     initCtx = new InitialContext(); 
     return (DataSource)initCtx.lookup("java:comp/env/"+jndiDb); 
    } catch (NamingException e) { 
     throw new EasyORMException(e); 
    }finally{ 
     if(initCtx!=null){ 
      try { 
       initCtx.close(); 
      } catch (NamingException e) { 
       throw new EasyORMException(e); 
      } 
     } 
    } 
} 
} 

(実際の実装はやや複雑ですが)

は、私は私のプロジェクトのいくつかについては、この接続プールを使用します)しかし、必要に応じて公開に変更することができます。

関連する問題