gpt4 book ai didi

java - DBUnit 和 SQL Server 关闭套接字

转载 作者:行者123 更新时间:2023-12-02 00:54:49 24 4
gpt4 key购买 nike

我在同一位置不断收到 DBUnit 的异常:

org.dbunit.dataset.DataSetException: com.microsoft.sqlserver.jdbc.SQLServerException: Socket closed
at org.dbunit.database.DatabaseTableMetaData.getColumns(DatabaseTableMetaData.java:359)

等等

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Socket closed
at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(Unknown Source)
at com.microsoft.sqlserver.jdbc.TDSChannel.read(Unknown Source)
at com.microsoft.sqlserver.jdbc.TDSReader.readPacket(Unknown Source)
at com.microsoft.sqlserver.jdbc.TDSReader.readPacket(Unknown Source)
at com.microsoft.sqlserver.jdbc.TDSCommand.startResponse(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(Unknown Source)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQueryInternal(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerDatabaseMetaData.getResultSetFromStoredProc(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerDatabaseMetaData.getResultSetWithProvidedColumnNames(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerDatabaseMetaData.getColumns(Unknown Source)
at org.dbunit.database.DefaultMetadataHandler.getColumns(DefaultMetadataHandler.java:52)
at org.dbunit.database.DatabaseTableMetaData.getColumns(DatabaseTableMetaData.java:315)
... 15 more

尝试从表中读取列元数据时会发生这种情况。执行此操作的代码如下所示:

 new DefaultTable(tableName,
Columns.getColumns(columns,
connection.createDataSet(new String[]{tableName})
.getTableMetaData(tableName).getColumns()
)
)

connection 是一个 MsSqlConnection 实例。起初我以为这是一个网络问题,但这个理论有两个问题。首先运行测试的服务器和数据库都是同一个xen服务器上的虚拟机,所以没有真实的网络。其次,虽然问题不一致,但每次都发生在同一个地方。有超过 100 个数据库测试,但同一个测试失败了(当它失败时)。

有人遇到过类似的问题吗?有什么见解吗?

最佳答案

经过一番重要的尝试后,还有其他代码测试代码正在读取元数据,但没有关闭结果集。现在问题就消失了。

我的理论如下。为了获取 MSSQL 中的数据库元数据,您必须连接到与当前连接不同的数据库。一种方法是更改​​数据库(MSSQL 中有一个 use 命令)。这种方法的问题在于,您可能会弄乱当前连接的事务,并且如果多个线程访问同一连接,则会引入线程问题。

因此,解决方案可能会在后台打开一个单独的连接,但如果不是整个虚拟机,则为整个连接共享一个连接对象。 JDBC 仅公开可以关闭的结果集,因此如果您没有对结果集调用 close 并自行关闭它,它们可能会放置一个关闭连接的终结器。问题是,如果其他东西同时读取元数据,它的连接就会从它下面关闭,因此我崩溃了。

鉴于这些测试运行发生在非常一致的代码路径上,内存使用模式肯定有可能相当稳定地运行,导致垃圾收集同时发生,但并不总是完全相同的时间,这符合它并不总是在完全相同的地方崩溃的观察结果。

这就是理论。我不确定如何确认,但除非问题再次出现,否则这是我的假设。经验教训:始终关闭读取元数据(以及一般情况)的结果集。

编辑(很长一段时间后):虽然一般来说上述情况可能仍然是正确的,但代码中还存在另一个问题 - 它本身使用了终结器。因此,您有一个连接的包装器,它在终结器中关闭连接,但让连接暴露给其他人。另一个重要的编码规则:如果您的终结器关闭资源,请始终确保在没有引用包含它们的类的情况下没有任何东西可以访问这些资源。

关于java - DBUnit 和 SQL Server 关闭套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1344020/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com