Java >> Java チュートリアル >  >> Tag >> Jdbc

JDBC とマルチスレッド

rohivats と Asaph が言ったように、1 つの接続は 1 つのスレッドだけで使用する必要があります。つまり、データベース接続プールの使用を検討してください。 c3p0、DBCP などはほとんど放棄されていることを考慮して、私は本当に高速で信頼性の高い HikariCP を使用します。

非常に単純なものが必要な場合は、スレッド セーフ コレクション (LinkedList など) を使用して非常に単純な接続プールを実装できます。たとえば、次のようになります。

 public class CutrePool{
      String connString;    
      String user;
      String pwd;

      static final int INITIAL_CAPACITY = 50;
      LinkedList<Connection> pool = new LinkedList<Connection>();
      public String getConnString() {
          return connString;
      }
      public String getPwd() {
          return pwd;
      }

      public String getUser() {
          return user;
      }

      public CutrePool(String connString, String user, String pwd) throws SQLException {
          this.connString = connString;
        
          for (int i = 0; i < INITIAL_CAPACITY; i++) {
               pool.add(DriverManager.getConnection(connString, user, pwd));
          }
          this.user = user;
          this.pwd = pwd;
      }

      public synchronized Connection getConnection() throws SQLException {
          if (pool.isEmpty()) {
              pool.add(DriverManager.getConnection(connString, user, pwd));
          }
          return pool.pop();
      }
    
      public synchronized void returnConnection(Connection connection) {
          pool.push(connection);
      }  
  }

ご覧のとおり、getConnection メソッドと returnConnection メソッドはスレッド セーフになるように同期されています。接続を取得します (conn = pool.getConnection(); ) 使用後に接続を返す/解放することを忘れないでください (pool.returnConnection(conn); )


すべてのスレッドで同じ接続オブジェクトを使用しないでください。各スレッドに専用のデータベース接続を提供します。


Java タグ