Java SQL PreparedStatement和维护连接

Java SQL PreparedStatement和维护连接,java,sql,database-connection,prepared-statement,Java,Sql,Database Connection,Prepared Statement,我正在创建一个服务器端Java任务,它永远每隔60秒执行一次相同的SQL更新,因此它非常适合使用Java.SQL.PreparedStatement 我宁愿每60秒重新连接一次数据库,也不愿假设一个连接在几个月后仍然有效。但是,如果每次打开新连接时都必须重新生成一个新的PreparedStatement,那么这似乎是在违背目的 我的问题是:由于PreparedStatement是从java.sql.Connection创建的,这是否意味着必须维护连接才能有效地使用PreparedStatemen

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

我宁愿每60秒重新连接一次数据库,也不愿假设一个连接在几个月后仍然有效。但是,如果每次打开新连接时都必须重新生成一个新的PreparedStatement,那么这似乎是在违背目的

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


我想我可以保持连接打开,然后只有在尝试更新时出现异常时才重新打开连接

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


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

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

现在,您可以采取两种不同的方法-

  • 在执行更新之前进行检查,如果返回false,则打开新连接

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


  • 对于同一份准备好的声明,您每60秒关闭和打开一次db连接,这听起来不是一个好主意。

    感谢Luiggi和Raj的回答。经过一些实验(使用PreparedStatement和Statement),我看不出在性能方面有多大差异。因此,我将保持它的简单性,每次打开和关闭连接。因为这是访问数据库的唯一方法,并且每60秒只访问一次数据库-连接池似乎有些过分。但是,感谢您的建议和有关db缓存准备好的语句的信息。@kevdev您可以拥有一个连接池。请注意,您不应该自己保持连接打开。将这项工作留给已经处理这些问题的技术来完成。谢谢,我收到一条错误消息,说postgresql还不支持Connection.isValid()。如果我想继续使用相同的连接,我会在更新过程中出现异常时重新打开它。