正确使用PreparedStatement

时间:2016-01-02 23:31:50

标签: java database jdbc

我们假设我们有一个在数据库中写入日志消息的类。从代码的不同部分调用此类,并一次又一次地执行相同的INSERT语句。似乎是要求使用PreparedStatement。

但是我想知道它的正确用法是什么。我是否仍然可以获得使用它的好处,比如DBMS在每次执行时使用相同的执行路径,即使我每次调用方法时都创建一个新的PreparedStatement,或者我应该将PreparedStatement作为类成员并且从不关闭为了重新使用它并从中获益?

现在,如果在这种情况下使用PreparedStatement获取收益的唯一方法是将其作为类成员保持打开,那么同一个连接是否可以同时打开不同的PreparedStatement(具有不同的查询)?当两个PreparedStatements同时执行时会发生什么? JDBC驱动程序是否对PreparedStatements的执行进行排队?

提前致谢, 达尼。

1 个答案:

答案 0 :(得分:3)

对于我所知道和经验丰富的所有内容,声明并非在一个连接上并行运行。正如您所观察到的那样,PreparedStatement被绑定到创建它们的Connection

由于您可能不希望同步日志记录调用(一次插入一次以及锁定开销),因此您必须保留为此日志记录语句保留的连接。

但只有一个声明的专用池似乎非常浪费 - 不想也这样做。

那么还剩下什么选择?

  • 为每个插入准备语句。由于您将进行数据传输到数据库的I / O操作,因此准备工作的开销相对较小。

  • 在池中准备创建新连接的语句,并构建Map <Connection,PreparedStatement>以便稍后引用它们。使创建新连接的速度稍慢但允许回收该语句。

  • 使用一些异步方式对日志进行排队(JMS)并在消息驱动的bean或类似内容中以批处理方式执行

可能还有更多的选择 - 但这就是我现在所能想到的。

祝你好运。