sql >> Database teknologi >  >> RDS >> Mysql

Bruger jeg JDBC Connection Pooling?

Forudsat at det er BasicDataSource er fra DBCP , så ja, du bruger en forbindelsespulje. Men du genskaber en anden forbindelsespulje ved hver forbindelsesindsamling. Du samler ikke rigtig forbindelser fra den samme pool. Du skal kun oprette forbindelsespuljen én gang ved applikationens opstart og få hver forbindelse fra den. Du bør heller ikke holde forbindelsen som en instansvariabel. Du bør også lukke forbindelsen, erklæringen og resultatsættet for at sikre, at ressourcerne lukkes ordentligt, også i tilfælde af undtagelser. Java 7's try-with-resources erklæring er nyttig i dette, vil den automatisk lukke ressourcerne, når try blokken er færdig.

Her er en mindre omskrivning:

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

}

(dette kan om nødvendigt omdannes til en abstrakt fabrik for at forbedre pluggbarheden)

og

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

som skal bruges som følger:

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

I et rigtigt Java EE-miljø bør du dog delegere oprettelsen af ​​DataSource til containeren/applikationsserveren og få den fra JNDI. I tilfælde af Tomcat, se også for eksempel dette dokument:http ://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html



  1. Hvordan får man sidste indsættelses-id i Oracle ved hjælp af MyBatis?

  2. Kan ikke få adgang til forudbefolket SQLite-database ved hjælp af PhoneGap/Cordova i Android

  3. ROUND() Eksempler i SQL Server

  4. PostgreSQL:Fuld tekstsøgning - Hvordan søger man delvise ord?