Реализовать пул соединений в JDBC с помощью apache dbcp

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

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

}

person user2998826    schedule 16.11.2013    source источник
comment
Я предлагаю вам прочитать stackoverflow.com/questions/520585/   -  person Elliott Frisch    schedule 16.11.2013
comment
DBCP в значительной степени заброшен, я рекомендую HikariCP, но опять же, я предвзят, так как помогал его писать.   -  person brettw    schedule 16.11.2013
comment
@brettw Кем «в значительной степени заброшен»? У вас есть статистика по этому поводу?   -  person user207421    schedule 11.08.2015
comment
@EJP-контекст. На момент моего комментария, ноябрь 2013 г., самым последним выпуском DBCP был Фев. 2010. Кажется, в последнее время он получил немного жизни.   -  person brettw    schedule 11.08.2015


Ответы (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 из файла свойств.

person brettw    schedule 16.11.2013
comment
привет, мог бы увидеть мой обновленный код выше, пожалуйста, работает ли он или нет? - person user2998826; 16.11.2013
comment
Выглядит достаточно нормально. Поскольку getConnection() не синхронизирован, два потока, срабатывающих одновременно (в первый раз), могут дважды инициализировать DataSource (поскольку оба считают его нулевым). Если то, что вы показали, это все, что вы пытаетесь сделать, я рекомендую просто использовать класс SQLClosure из SansORM и не утруждая себя написанием собственного хелпера. - person brettw; 16.11.2013