Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Czy korzystam z puli połączeń JDBC?

Zakładając, że jest to BasicDataSource pochodzi z DBCP , to tak, używasz puli połączeń. Jednak przy każdym pozyskaniu połączenia odtwarzasz inną pulę połączeń. Tak naprawdę nie łączysz połączeń z tej samej puli. Pulę połączeń należy utworzyć tylko raz podczas uruchamiania aplikacji i pobierać z niej każde połączenie. Nie należy również przechowywać połączenia jako zmiennej instancji. Należy również zamknąć połączenie, instrukcję i zestaw wyników, aby zapewnić prawidłowe zamknięcie zasobów, również w przypadku wyjątków. try-with-resources oświadczenie jest w tym pomocne, automatycznie zamknie zasoby, gdy try blok jest zakończony.

Oto drobna przeróbka:

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

}

(może to w razie potrzeby zostać przekształcone w abstrakcyjną fabrykę, aby poprawić podłączalność)

i

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

który ma być używany w następujący sposób:

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

W prawdziwym środowisku Java EE należy jednak delegować tworzenie DataSource do kontenera/serwera aplikacji i uzyskaj go z JNDI. W przypadku Tomcata zobacz także na przykład ten dokument: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. Grupuj wiersze za pomocą grupowania według klauzuli w MySQL

  2. Czy liczba może być użyta do nazwania kolumny tabeli MySQL?

  3. Połącz wiele wierszy podrzędnych w jeden wiersz MYSQL

  4. Wyłącz ostrzeżenia i błędy w PHP i MySQL

  5. Znajdź drugą najwyższą pensję w najlepszy możliwy sposób