JDBC连接池建议

时间:2012-06-08 03:33:59

标签: java mysql jdbc database-connection connection-pooling

我正在java中开发一个应用程序来处理数据并将其上传到MySQL数据库。使用此应用程序,我遍历需要在目录中处理的所有文件。对于文件的每一行,我将该行中的数据存储到各种变量中,并进行一些转换以准备好上传到我的数据库的所有数据。然后我计划使用PreparedStatement和INSERT查询将该行的数据上传到数据库。

我不熟悉我的情况的最佳做法。我正在向自己教这个,所以我正在寻找一些指导,以确保我第一次正确地做到这一点。

仅仅在应用程序运行时开始时打开连接(即打开一次)是不合适的吗?对于每个插入查询,我将创建并关闭PreparedStatement,但我只是将连接保持打开状态,直到我完成所有文件的处理。

我已经阅读过其他地方的连接池,但我无法弄清楚它是否适用于我的情况。我知道经常打开和关闭连接的费用很高,但我不应该只打开一次并在该连接下运行我的所有查询吗?

如果您建议使用连接池,那么您会针对我的情况推荐哪种服务。优选地,将很容易快速获得处理。我的项目有些时间敏感。感谢。

2 个答案:

答案 0 :(得分:3)

如果您正在开发桌面Java应用程序,则不会使用连接池。连接池由Java应用程序服务器(Tomcat,JBoss,Glassfish)管理,在桌面Java应用程序中不可用。

如果您要进行一次更新,保持连接打开是合理的。

此外,批量更新对您来说是一个好主意:

String connectionURL = "jdbc:mysql://localhost:3306/database";
Connection con = null;
PreparedStatement stmt = null;

try {
    Class.forName("com.mysql.jdbc.Driver");
    con = DriverManager.getConnection(connectionURL);
    stmt = con.prepareStatement(statement);

    for (Object o : list) {    // this is a list of your Java entity class
        stmt.setString(1, "foo");    // this is to update the parameters in the PreparedStatement
        stmt.setString(2, "bar");

         stmt.addBatch();     //  this adds the PreparedStatement to the batch of statements to execute
    }

    stmt.executeBatch();

} catch (SQLException e) {
    e.printStackTrace();
} catch (Exception e) {
    e.printStackTrace();
} finally {
    if (stmt != null) {
        stmt.close();
    }
    if (con != null) {
        con.close();
    }
}

批量更新的想法是有一个预准备语句,您只需更改参数,并将“new”语句添加到一批语句中。然后,当您调用stmt.executeBatch()

时,您可以一次性执行它们

但是,如果你有很多这样的陈述,我会建议你一次执行30个语句。否则,如果程序崩溃/失败,您将陷入困境。

答案 1 :(得分:0)

这听起来像是正在实施的批处理过程。在这种情况下,与数据库的专用连接是更好的解决方案。