admin

是否有任何工具或技术可以识别打开的ResultSet

sql

在使用SQLIte持久化数据的Java应用程序的上下文中,我正在使用Zentus
JDBC驱动程序。因此,我正在使用java.sql包访问我的数据库。

我遇到了一些奇怪的问题(在同一个数据库中有多个Connection对象的环境中),我很确定我的问题来自非封闭的ResultSet。

有什么工具或技术可以让我发现在源代码中查找这些非封闭对象的位置吗?

*可以使用 *AspectJ进行 编辑


阅读 161

收藏
2021-06-07

共1个答案

admin

看起来一个方面可能会有所帮助。

如何包装在方面中返回结果集的方法。就像是:

execution(public java.sql.ResultSet+ java.sql.Statement+.*(..))

另一个方面可以监视ResultSet上的close方法。可能:

execution(public * java.sql.ResultSet.close())

第一个方面是,在返回每个ResultSet时,将创建一个新的Exception对象,并使用ResultSet的哈希值作为键将其存储在某个静态Map中。第二方面,在结果集关闭时,将使用相同的哈希码作为键从Map中删除Exception。映射在任何时候都应为每个打开的ResultSet都具有一个异常实例。从异常中,您可以获得堆栈跟踪,以查看ResultSet的打开位置。

您也许可以存储一个更大的对象,其中包括一个异常和一些其他上下文信息。创建ResultSet的时间,等等。

2021-06-07