【问题标题】:Java SQL PreparedStatement and maintaining connectionJava SQL PreparedStatement 和维护连接
【发布时间】:2014-05-29 04:44:15
【问题描述】:

我正在创建一个服务器端 Java 任务,它永远每 60 秒执行一次相同的 SQL UPDATE,因此它非常适合使用 java.sql.PreparedStatement。

我宁愿每 60 秒重新连接一次数据库,也不愿假设单个连接在未来几个月仍能正常工作。但是,如果每次打开新连接时都必须重新生成一个新的 PreparedStatement,这似乎违背了目的。

我的问题是:由于 PreparedStatement 是从 java.sql.Connection 创建的,这是否意味着必须维护连接才能有效地使用 PreparedStatement,或者是 PreparedStatement 保存在数据库中而不是每个都重新编译新连接?我目前正在使用 postgresql,但可能并不总是。

我想我可以保持连接打开,然后仅在尝试更新时发生异常时重新打开。

【问题讨论】:

  • 感谢 Luiggi 和 Raj 的回答。经过一些实验(同时使用 PreparedStatement 和 Statement),我认为性能方面没有太大差异。所以我会保持简单,每次都打开和关闭连接。

标签: java sql database-connection prepared-statement


【解决方案1】:

使用数据库连接池。即使在关闭它们之后,这也会使连接在睡眠模式下保持活动状态。这种方法还可以为您的应用程序节省性能。

尽管创建了PreparedStatement的连接,但SQL语句会被数据库引擎缓存,在重新创建PreparedStatement对象时不会有任何问题。

【讨论】:

  • 因为这是唯一访问数据库的东西,并且每 60 秒只访问一次 - 连接池似乎有点过分了。但是感谢您的建议以及有关数据库缓存准备好的语句的信息。
  • @kevdev 您可以拥有一个包含 1 个连接的连接池。请注意,您不应该自己保持连接打开。把这项工作留给已经解决这些问题的技术。
【解决方案2】:

将连接超时设置为 SQL 执行时间+几分钟。

现在,您可以在这里采取 2 种不同的方法 -

  1. 执行更新前检查,如果返回false则打开新连接

    if( connection == null  || !connection.isValid(0)) {
    // open new connection and prepared statement
    }
    
  2. 在 Db 中编写一个存储过程,并通过必要的参数调用它。这是另一种方法。

关于你为同一个准备好的语句每 60 秒关闭和打开数据库连接的方法,这听起来不是一个好主意。

【讨论】:

  • 谢谢,我收到一条错误消息,指出 postgresql 尚不支持 Connection.isValid()。如果我想继续使用相同的连接,我会在更新期间发生异常时重新打开它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-02
  • 2016-05-24
  • 2013-03-19
  • 1970-01-01
相关资源
最近更新 更多