重用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
个实例,但另一方面仍然能够获得新连接并关闭旧连接(并不总是有相同的连接打开)我该怎么办?
答案 0 :(得分:1)
PreparedStatement
是(或者应该)由JDBC驱动程序缓存的。参见例如http://www.mchange.com/projects/c3p0/
这意味着您不应该坚持使用并在连接之间使用,但不要担心,您的驱动程序将为您管理缓存。基本上发生的事情是每个连接都会缓存它自己,所以如果你有5个连接,你将有5个缓存副本,这可能足够小。
如果缓存,则调用prepareStatement
将从缓存中检索,否则将分配。因此,对prepareStatement
的重复调用是轻量级的。这是API的正确使用。
参见例如Oracle's docs这在技术上是特定于Oracle的,但我相信这些信息是标准的。