Estou usando o pool de conexão JDBC?

Eu estou tentando determinar se estou realmente usando o pool de conexão JDBC. Depois de fazer alguma pesquisa, a implementação parece muito fácil. Mais fácil do que uma conexão regular, de fato, então eu gostaria de verificar.

Aqui está minha class de conexão:

public class DatabaseConnection { Connection conn = null; public Connection getConnection() { BasicDataSource bds = new BasicDataSource(); bds.setDriverClassName("com.mysql.jdbc.Driver"); bds.setUrl("jdbc:mysql://localhost:3306/data"); bds.setUsername("USERNAME"); bds.setPassword("PASSWORD"); try{ System.out.println("Attempting Database Connection"); conn = bds.getConnection(); System.out.println("Connected Successfully"); }catch(SQLException e){ System.out.println("Caught SQL Exception: " + e); } return conn; } public void closeConnection() throws SQLException { conn.close(); } 

}

Isso é verdadeiro pool de conexão? Eu estou usando a conexão em outra class da seguinte forma:

  //Check data against database. DatabaseConnection dbConn = new DatabaseConnection(); Connection conn; ResultSet rs; PreparedStatement prepStmt; //Query database and check username/pass against table. try{ conn = dbConn.getConnection(); String sql = "SELECT * FROM users WHERE username=? AND password=?"; prepStmt = conn.prepareStatement(sql); prepStmt.setString(1, user.getUsername()); prepStmt.setString(2, user.getPassword()); rs = prepStmt.executeQuery(); if(rs.next()){ //Found Match. do{ out.println("UserName = " + rs.getObject("username") + " Password = " + rs.getObject("password")); out.println("
"); } while(rs.next()); } else { out.println("Sorry, you are not in my database."); //No Match. } dbConn.closeConnection(); //Close db connection. }catch(SQLException e){ System.out.println("Caught SQL Exception: " + e); }

Assumindo que é o BasicDataSource é do DBCP , então sim, você está usando um pool de conexão. No entanto, você está recriando outro pool de conexão em cada aquisição de conexão. Você não está realmente agrupando conexões do mesmo pool. Você precisa criar o pool de conexão apenas uma vez na boot do aplicativo e obter todas as conexões dele. Você também não deve manter a conexão como uma variável de instância. Você também deve fechar a conexão, a instrução e o conjunto de resultados para garantir que os resources sejam fechados corretamente, também no caso de exceções. A instrução try-with-resources Java 7 é útil nisso, ele fechará automaticamente os resources quando o bloco try estiver concluído.

Aqui está uma pequena reescrita:

 public final class Database { private static final BasicDataSource dataSource = new BasicDataSource(); static { dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/data"); dataSource.setUsername("USERNAME"); dataSource.setPassword("PASSWORD"); } private Database() { // } public static Connection getConnection() throws SQLException { return dataSource.getConnection(); } } 

(isso pode, se necessário, ser refatorado como uma fábrica abstrata para melhorar a capacidade de conexão)

e

 private static final String SQL_EXIST = "SELECT * FROM users WHERE username=? AND password=?"; public boolean exist(User user) throws SQLException { boolean exist = false; try ( Connection connection = Database.getConnection(); PreparedStatement statement = connection.prepareStatement(SQL_EXIST); ) { statement.setString(1, user.getUsername()); statement.setString(2, user.getPassword()); try (ResultSet resultSet = preparedStatement.executeQuery()) { exist = resultSet.next(); } } return exist; } 

que deve ser usado da seguinte forma:

 try { if (!userDAO.exist(username, password)) { request.setAttribute("message", "Unknown login. Try again."); request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); } else { request.getSession().setAttribute("user", username); response.sendRedirect("userhome"); } } catch (SQLException e) { throw new ServletException("DB error", e); } 

Em um ambiente Java EE real, você deve delegar a criação do DataSource ao servidor de contêiner / aplicativo e obtê-lo do JNDI. No caso do Tomcat, veja também, por exemplo, este documento: http://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html

Não parece que está em pool. Você deve armazenar o DataSource em DatabaseConnection em vez de criar um novo com cada chamada getConnection (). getConnection () deve retornar datasource.getConnection ().

Parece um uso de DBCP. Se sim, então sim. Já está em pool. E aqui está o valor padrão da propriedade do pool do DBCP.

 /** * The default cap on the number of "sleeping" instances in the pool. * @see #getMaxIdle * @see #setMaxIdle */ public static final int DEFAULT_MAX_IDLE = 8; /** * The default minimum number of "sleeping" instances in the pool * before before the evictor thread (if active) spawns new objects. * @see #getMinIdle * @see #setMinIdle */ public static final int DEFAULT_MIN_IDLE = 0; /** * The default cap on the total number of active instances from the pool. * @see #getMaxActive */ public static final int DEFAULT_MAX_ACTIVE = 8; 

Como acompanhamento da solução da BalusC, abaixo está uma implementação que pode ser usada em um aplicativo que requer mais de uma conexão ou em uma biblioteca comum que não conheceria as propriedades da conexão antecipadamente …

 import org.apache.commons.dbcp.BasicDataSource; import java.sql.Connection; import java.sql.SQLException; import java.util.concurrent.ConcurrentHashMap; public final class Database { private static final ConcurrentHashMap dataSources = new ConcurrentHashMap(); private Database() { // } public static Connection getConnection(String connectionString, String username, String password) throws SQLException { BasicDataSource dataSource; if (dataSources.containsKey(connectionString)) { dataSource = dataSources.get(connectionString); } else { dataSource = new BasicDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl(connectionString); dataSource.setUsername(username); dataSource.setPassword(password); dataSources.put(connectionString, dataSource); } return dataSource.getConnection(); } }