Java >> Java tutorial >  >> Tag >> Jdbc

JDBC og Multithreading

Som rohivats og Asaph sagde, skal én forbindelse bruges af én og kun én tråd, når det er sagt, overvej at bruge en databaseforbindelsespulje. I betragtning af at c3p0, DBCP og lignende næsten er forladt, ville jeg bruge HikariCP, som er virkelig hurtig og pålidelig.

Hvis du vil have noget meget simpelt, kan du implementere en virkelig simpel forbindelsespool ved hjælp af en trådsikker samling (såsom LinkedList), for eksempel:

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

Som du kan se, er getConnection og returnConnection metoder synkroniseret for at være trådsikre. Få en forbindelse (conn = pool.getConnection(); ) og glem ikke at returnere/frigøre en forbindelse efter brug (pool.returnConnection(conn); )


Brug ikke det samme forbindelsesobjekt i alle tråde. Giv hver tråd en dedikeret databaseforbindelse.


Java tag