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条语句。否则,如果程序崩溃/失败,您将陷入困境。
这听起来像您正在执行的批处理。在那种情况下,到数据库的专用连接是更好的解决方案。