1

CallableStatement重用的实例通常被认为是一种好习惯(请查看此处)。

但是在创建. 时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实例,但另一方面仍然能够获得新连接并关闭旧连接(并非总是打开相同的连接),我该怎么办?

4

1 回答 1

2

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

这意味着您不应保留一个并在连接之间使用,但请放心,您的驱动程序将为您管理缓存。本质上,每个连接都会缓存自己的连接,因此如果您有 5 个连接,那么您将有 5 个缓存副本,这可能足够小。

如果缓存,调用prepareStatement将从缓存中检索,如果没有,则分配。所以重复调用prepareStatement是轻量级的。这是API的正确使用。

请参阅例如Oracle 的文档,该文档在技术上是特定于 Oracle 的,但我相信这些信息是标准的。

于 2013-10-07T00:28:54.580 回答