2011-11-04 93 views
1

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

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

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

它在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

这样,您现在可以节省处理呼叫的一些步骤。 您会发现,每次准备新的调用时,都必须通过优化器继续运行db,这会花费时间和资源。一旦您的prepareCall被设置,请保持打开状态(并在dbserver上查找)以获得更好的性能。

你在代码中错过这样的:

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

你应该保持支点作为字段而不是变量。

注意:如果你需要资源,并且你有很多preparedStatements和Calls,你应该关闭那些不经常被调用的大的语句。

我在微软发现了这个:diagram how it workshere。我找不到更好的照片。

1

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

相关问题