当使用 C3P0 连接池管理数据库连接时,可能遇到该错误:java.sql.SQLException: Can't call getMoreResults() when the result is not a TYPE_FORWARD_ONLY result set
。
原因分析
此错误是由 C3P0 连接池的 defaultStatementType
设置导致的。默认情况下,C3P0 使用 TYPE_SCROLL_SENSITIVE
结果集类型。这种类型允许在结果集中向前和向后滚动,但它要求数据库服务器保持结果集打开,从而消耗额外的资源。
当使用 C3P0 执行包含多个结果集的 SQL 语句时,问题就会出现。如果第一个结果集不是 TYPE_FORWARD_ONLY
,C3P0 会将所有结果集都保持打开状态,导致数据库服务器内存溢出。
解决
要解决此错误,可以将 C3P0 的 defaultStatementType
设置为 TYPE_FORWARD_ONLY
。
在 c3p0-config.xml
配置文件中,添加以下代码:
xml
也可以在程序代码中动态设置 defaultStatementType
:
java
ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDefaultStatementType(ResultSetType.TYPE_FORWARD_ONLY);
其他注意事项
在使用 C3P0 时,还可以采取以下措施来避免此错误:
始终使用 Statement.setFetchSize(0)
显式设置结果集大小为 0,以强制使用 TYPE_FORWARD_ONLY
。
在完成处理后及时关闭结果集和语句,以释放数据库服务器资源。