我正在使用c3p0。我建立了如下集合,c3p0 Prepared Statement沒有明顯原因關閉
cpds = new ComboPooledDataSource();
cpds.setJdbcUrl(...);
/* connection setup */
spds.setMaxStatements(200);
我有一個對象可以在初始化時準備幾個準備好的語句。爲此,我從PooledDataSource中獲取一個連接(con = getConnection()
),然後準備一個語句(例如,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的語句緩存的用途是什麼。
我猜測連接會關閉它所瞭解的語句。然而,我很努力地在某處找到一個明確的參考,這與此一致。 –