多次使用`java.sql.CallableStatement`而不关闭它

时间:2011-11-04 16:43:34

标签: java mysql jdbc

我有一个带有3个参数的java.sql.CallableStatement,我需要多次调用它,为第三个参数传递不同的值。

这样做的正确方法是什么?我每次都可以创建一个新的可调用语句,但据我所知,它将访问db。

当前代码通过更改第三个参数调用相同的语句实例,而不关闭它并且似乎它可以工作。跳过关闭可调用语句是否正常?

它在MySQL jdbc连接上运行。

代码段:

CallableStatement pivot = connection.prepareCall("{CALL pivot(?, ?, ?)]");
pivot.setString(1, "a");
pivot.setString(2, "b");
while(someCondition) {
  pivot.setString(3, "c");
  ResultSet res = pivot.executeQuery();
  try {
    // ...
  } finally {
    res.close();
  }
}

2 个答案:

答案 0 :(得分:2)

这样,您现在拥有一些处理呼叫的步骤。 你看,每次你准备新的调用时,它都必须通过优化器继续运行db,这需要花费时间和资源。设置readyCall后,将其保持打开状态(并在dbserver上进行操作)以获得更好的性能。

你在代码中错过了这个:

if(pivot == null)
    pivot = connection.prepareCall("{CALL pivot(?, ?, ?)]"); 

你应该将pivot作为字段而不是变量。

注意:如果您需要资源并且有许多准备好的声明和调用,那么您应该关闭那些经常没有调用的重要资源。

我在微软上找到了这个:diagram how it works来自here。我找不到更好的照片了。

答案 1 :(得分:1)

如果您自己管理连接,那么可以将语句打开很长时间。但是,将此工作委托给内部具有连接池的DataSource可能更好(检查Apache DBCP,或者您的JDBC驱动程序也可能具有特定的实现);它会做同样的事情,但通常错误概率较低。对于数据源,您必须始终关闭语句和连接以将它们返回到池中。