钟二网络头像

钟二网络

探索SQL查询技巧、Linux系统运维以及Web开发前沿技术,提供一站式的学习体验

  • 文章92531
  • 阅读905070
首页 SQL 正文内容

同样的sql语句用c3p0会报错

钟逸 SQL 2025-06-30 12:35:40 3

当使用 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

在完成处理后及时关闭结果集和语句,以释放数据库服务器资源。

文章目录
    搜索