Skip to content

Conversation

@guanchengang
Copy link

在原来的实现中,如果复用了同一个statement 并且没有显示关闭结果集的话或者延迟关闭了会导致resultSetTrace保存大量没有必要的resultSet
大部分的数据库的jdbc实现都是一个statement只能持有一个打开的resultSet,在打开新resultSet的时候会隐式关闭旧的连接,但是DruidPooledResultSet的实现又包裹了一层closed,就会出现实际上rawResultSet已经关闭了但是外层DruidPooledResultSet的closed还是false的状态出现。
虽然这个pr不能完全解决因为各种奇奇怪怪的问题导致的DruidPooledResultSet的关闭状态内外不一致的情况,但是可以在一定程度上减轻resultSetTrace的泄露问题。
并且这样可以保持和底层数据库使用同一个statement的行为是一致的。(包括非标准情况,如果底层的rawResultSet没有被关闭我们还是可以继续跟踪他们,如果被关闭了,也没有必要跟踪了)

DruidPooledConnection connection = dataSource.getConnection();
DruidPooledStatement statement = (DruidPooledStatement) connection.createStatement();
for (int i = 0; i < 100; i++) {
  statement.executeQuery(sql);
}
// 这个时候resultSetTrace里面会跟踪100个resultSet
// 前99个都处于上文提到的状态中,只有最后一个是可用的

@CLAassistant
Copy link

CLAassistant commented Sep 28, 2025

CLA assistant check
All committers have signed the CLA.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants