我正在使用 c3p0。我设置了一个池如下,
cpds = new ComboPooledDataSource();
cpds.setJdbcUrl(...);
/* connection setup */
spds.setMaxStatements(200);
我有一个对象,它在初始化时准备了几个准备好的语句。为此,我con = getConnection()
从 PooledDataSource 中获取一个连接 ( ),然后准备一个语句 (例如PreparedStatement stmt = con.preparedStatemet(/*sql*/)
)。准备好的语句作为私有变量存储在对象中,当前连接在初始化结束时关闭(con.close()
)。准备好的语句用于对象的方法中。
对于更新数据库的准备好的语句,这工作得很好。但是,当我调用使用准备好的语句 ( stmt.executeQuery()
) 来查询数据库的方法时,我得到以下 SQLException
java.sql.SQLException: You can't operate on a closed Statement!!!
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:118)
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:77)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:127)
我对 c3p0 的使用有什么误解吗?
提前谢谢了!
编辑:显然,我的问题部分是基于我缺乏理解。正如在明确答案中所指出的那样,PreparedStatement 属于一个连接,每当连接关闭时,相关的语句也应该关闭。但是如果是这样的话,我不明白c3p0的语句缓存有什么用。