2013-11-16 5 views
2

Этот хороший код для реализации пула? Я хочу реализовать это в своем проекте, который имеет 30 потоков, работающих одновременно, и для каждого потока требуется более четырех соединений для каждого запроса? Работает ли этот код?Реализовать объединение пулов в JDBC с помощью apache dbcp

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

import java.sql.Connection; 
import java.sql.SQLException; 
import org.apache.commons.dbcp.BasicDataSource; 

/** 
* 
* @author 
* taher_JAVAHUNTER 
*/ 

    public class JDBCHelper { 

     private final static String username = "root"; 
     private final static String password = ""; 
     private final static String url = "jdbc:mysql://localhost:3306/treamisdemo"; 
     public static Connection connection = null; 
     public static int connectionCount = 0; 
    // public JDBCHelper(boolean setCon) { 
    //  try { 
    //   setConnectionTest(); 
    //  } catch (Exception e) { 
    //   System.out.println("Error in Connection:" + e.toString()); 
    //  } 
    // } 
     public static BasicDataSource dataSource; 

     public static Connection getConnection() throws SQLException { 
      try { 
       if (dataSource == null) { 
        dataSource = new BasicDataSource(); 
        String driver = "com.mysql.jdbc.Driver"; 
        try { 
         dataSource.setDriverClassName(driver); 
         dataSource.setUrl(url); 
         dataSource.setUsername(username); 
         dataSource.setPassword(password); 
         dataSource.setMaxActive(100); 
         dataSource.setMaxWait(10000); 
         dataSource.setMaxIdle(10); 
         if (connection == null || connection.isClosed()) { 
          System.out.println(" requeition CONNECTION WITH FIRST SERVER."); 
          connection = dataSource.getConnection(); 
          connectionCount++; 
         } 
        } catch (SQLException e) { 
         System.out.println("***Connection Requisition*** Could not connect to the database msg :" + e.getMessage()); 
        } 
       } else { 
        connection = dataSource.getConnection(); 
        connectionCount++; 
       } 
      } catch (Exception e) { 
       System.out.println("open connection exception" + e); 
      } 
      return connection; 
     } 

     public static void close(ResultSet c) { 
      try { 
       if (c != null) { 
        c.close(); 
       } 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 
     } 

     public static void close(Statement c) { 
      try { 
       if (c != null) { 
        c.close(); 
       } 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 
     } 

     public static void close(Connection c) { 
      try { 
       if (c != null) { 
        c.close(); 
       } 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 
     } 

} 
+2

Я предлагаю вам прочитать http://stackoverflow.com/questions/520585/connection-pooling-options-with-jdbc-dbcp-vs-c3p0?rq=1 –

+1

DBCP в значительной степени оставлен, я рекомендую [HikariCP] (http://brettwooldridge.github.io/HikariCP/), но опять же я предвзятый, поскольку я помог написать его. – brettw

+0

@brettw «В значительной степени брошен» кем? У вас есть статистика по этому поводу? – EJP

ответ

1

Я бы не рекомендовать этот подход. Вы в основном создаете соединение и висете на нем это. Я не влюблена в ваш шаблон, но что-то вроде этого было бы лучше:

public class DataTransaction { 
    private final static BasicDataSource dataSource; 

    static { 
     dataSource = new BasicDataSource(); 
     dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 
     dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/registrationtest"); 
     dataSource.setUsername("root"); 
     dataSource.setPassword("root"); 
     dataSource.setMaxActive(100); 
     dataSource.setMaxWait(10000); 
     dataSource.setMaxIdle(10); 
    } 

    private DataTransaction() { 
    } 

    public static DataSource getDataSource() { 
     return dataSource; 
    } 
} 

Кроме того, я бы не жёстко какой-либо из параметров DataSource, а инициализировать DataSource из файла свойств.

+0

Привет, мой обновленный код выше plz, работает ли он или нет? – user2998826

+1

Выглядит неплохо. Поскольку getConnection() не синхронизирован, два потока, попадающие в одно и то же время (в первый раз), могут инициализировать DataSource дважды (потому что оба считают, что это null). Если вы продемонстрировали все, что вы пытаетесь сделать, я рекомендую просто использовать класс '' SQLClosure'' из библиотеки [SansORM] (https://github.com/brettwooldridge/SansOrm) и не беспокоить собственный помощник. – brettw