sql >> Databasteknik >  >> RDS >> Mysql

Använder jag JDBC Connection Pooling?

Förutsatt att det är BasicDataSource är från DBCP , då ja, du använder en anslutningspool. Men du återskapar en annan anslutningspool vid varje anslutningsförvärv. Du samlar inte riktigt anslutningar från samma pool. Du behöver bara skapa anslutningspoolen en gång när programmet startar och hämta varje anslutning från den. Du bör inte heller hålla anslutningen som en instansvariabel. Du bör också stänga kopplingen, uttalandet och resultatuppsättningen för att säkerställa att resurserna är ordentligt stängda, även vid undantag. Java 7:s try-with-resources uttalande är till hjälp i detta, kommer den automatiskt att stänga resurserna när try blocket är klart.

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

}

(detta kan vid behov omstruktureras som en abstrakt fabrik för att förbättra pluggbarheten)

och

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 ska användas enligt följande:

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 en riktig Java EE-miljö bör du dock delegera skapandet av DataSource till behållaren/applikationsservern och hämta den från JNDI. När det gäller Tomcat, se även till exempel detta dokument:http ://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html



  1. Databaskorruption

  2. Vad är realtidsappar?

  3. Hur man definierar en primärnyckel för automatisk ökning i SQL Server

  4. Hur infogar/uppdaterar man större data i Oracle-tabellerna?