Mysql
 sql >> база данни >  >> RDS >> Mysql

Използвам ли JDBC пул за връзки?

Ако приемем, че това е BasicDataSource е от DBCP , тогава да, използвате пул за връзки. Въпреки това, вие пресъздавате друг пул за връзки при всяко придобиване на връзка. Вие всъщност не обединявате връзки от един и същи пул. Трябва да създадете пула за връзки само веднъж при стартиране на приложението и да получите всяка връзка от него. Също така не трябва да държите връзката като променлива на екземпляра. Трябва също да затворите връзката, оператора и набора от резултати, за да гарантирате, че ресурсите са правилно затворени, също в случай на изключения. try-with-resources на Java 7 изявление е полезен в това, той автоматично ще затвори ресурсите, когато try блокът е завършен.

Ето малко пренаписване:

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

}

(това може, ако е необходимо, да бъде преработено като абстрактна фабрика за подобряване на включваемостта)

и

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

който трябва да се използва, както следва:

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

В реална Java EE среда обаче трябва да делегирате създаването на DataSource към контейнера/сървъра на приложения и го вземете от JNDI. В случай на Tomcat, вижте също например този документ:http ://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какъв тип данни да използвате за полето за хеширана парола и каква дължина?

  2. Заявката SELECT връща 1 ред от всяка група

  3. pip install mysqlclient връща фатална грешка C1083:Не може да се отвори файл:'mysql.h':Няма такъв файл или директория

  4. Как да промените НАБОР ОТ СИМВОВЕ (и СЪБОРЯВАНЕ) в цялата база данни?

  5. Как да съхранявам unicode в MySQL?