是否可以在不同的连接上执行CallableStament?

时间:2013-10-07 00:22:17

标签: sql jdbc prepared-statement connection-pooling callable-statement

重用CallableStatement的实例通常被认为是一种好习惯(检查here)。

但是在创建CallableStatement时,该语句(根据我的理解)受到约束 到特定的Connection。所以我们通常会这样做:

Connection con = pool.getConnection();
CallableStatement st = con.prepareCall("{ some stmt; }");
st.executeQuery();
st.close();
con.close();            

根据我的检查,以下内容不会执行查询:

Connection con = pool.getConnection();
CallableStatement st = con.prepareCall("{ some stmt; }");
con.close();
con = pool.getConnection(); // possibly another new connection, different than the one used to create the CallableStatement instance
st.executeQuery();
st.close();

我的问题是:如果我想重用我的所有CallableStatement个实例,但另一方面仍然能够获得新连接并关闭旧连接(并不总是有相同的连接打开)我该怎么办?

1 个答案:

答案 0 :(得分:1)

PreparedStatement是(或者应该)由JDBC驱动程序缓存的。参见例如http://www.mchange.com/projects/c3p0/

这意味着您不应该坚持使用并在连接之间使用,但不要担心,您的驱动程序将为您管理缓存。基本上发生的事情是每个连接都会缓存它自己,所以如果你有5个连接,你将有5个缓存副本,这可能足够小。

如果缓存,则调用prepareStatement将从缓存中检索,否则将分配。因此,对prepareStatement的重复调用是轻量级的。这是API的正确使用。

参见例如Oracle's docs这在技术上是特定于Oracle的,但我相信这些信息是标准的。