1

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

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

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

我在其他地方读过有关连接池的信息,但我不知道它是否适用于我的情况。我知道频繁打开和关闭连接很昂贵,但我不应该只打开一次并在该连接下运行所有​​查询吗?

如果您建议使用连接池,您会针对我的情况推荐什么服务。最好很容易快速掌握。我的项目有点时间敏感。谢谢。

4

2 回答 2

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

批量更新的想法是有一个准备好的语句,您可以在其中简单地更改参数,并将“新”语句添加到一批语句中。然后,您可以在调用 stmt.executeBatch() 时一次性执行它们

但是,如果您有许多这样的语句,我建议您一次执行大约 30 条语句。否则,如果程序崩溃/失败,您将陷入困境。

于 2012-06-08T03:53:33.603 回答
0

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

于 2012-06-08T03:39:35.270 回答