关于java:JDBC连接池建议

JDBC connection pooling advice

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

我不了解适合自己情况的最佳做法。我正在对自己进行自学,因此我正在寻找一些指导,以确保我第一次正确执行此操作。

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

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

如果您建议使用连接池,那么您会为我的情况推荐什么服务。优选地,容易快速抓紧手柄。我的项目在时间上有些敏感。谢谢。


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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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条语句。否则,如果程序崩溃/失败,您将陷入困境。


这听起来像您正在执行的批处理。在那种情况下,到数据库的专用连接是更好的解决方案。