문제

내가 계속 이 예외로 DBUnit 에 같은 장소:

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

etc.

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()
                    )
            )

연결되는 MsSqlConnection 인스턴스입니다.처음에는 제가 생각했 네트워크 문제이지만,두 가지 문제가 있는 이론이다.첫번째 서버를 실행하는 테스트와 데이터베이스가 모두 가상 컴퓨터에서 동일한 xen server,그래서 진짜 네트워크입니다.둘째,하지만 문제는 일관성,그것은 발생 같은 장소에서 매 시간입니다.기 100 개 이상의 데이터베이스의 테스트,하지만 이것은 같은 사람은 하나 실패하는(실패할 경우).

는 사람을 통해 실행하면 유사한 문제입니까?어떤 통찰력?

도움이 되었습니까?

해결책

후에 몇 가지 중요한 재생이 있었는 다른 코드를 테스트하는 코드 메타데이터를 읽지 않을 닫는 결과를 설정합니다.지금 문제는 떨어져 갔다.

내 이론은 다음과 같습니다.을 얻기 위해서는 데이터베이스에서 메타데이터 MSSQL,당신은 당신을 연결하는 이외의 다른 데이터베이스는 현재 연결이있다.하는 방법 중 하나를 변경하는 데이터베이스(있을 사용하여 명령에 MSSQL).문제로 접근할 수 있는 엉망의 트랜잭션으로 현재 연결을 소개하는 것을 실을 꿰는 경우 문제 더 이상 하나의 스레드에 액세스합니다.

그래서 솔루션을 가능성이 열리는 별도의 연결 후드,하지만 공유하는 하나의 연결 객체에 대한 전반적인 연결하지 않을 경우,전체 VM.JDBC 만을 노출한 결과를 설정 닫을 수 있는,그래서 그들은 넣어 가지고 있습니다 종료자는 연결을 닫지 않은 경우라고 가까이에 결과를 설정하고 닫습니다.문제는 경우 다른 무언가가 메타데이터를 읽은 동일한 시간에,그것은 그것의 연결을 닫을 아래에서 그것은,그러므로 나의 충돌이 발생합니다.

이러한 테스트 실행되었에서 일어나는 매우 일관된 코드의 경로 그것은 확실히 가능한 메모리 사용량 패턴 매우 안정적인 실행을 실행하는 원인이 쓰레기 수집에서 발생하는 동시에,항상은 아니지만 동시에 정확히 맞는 관찰하지 않았다는 것을 항상에서 충돌을 정확히 동일한 장소입니다.

는 이론이다.나는 확실하지 않는 방법을 확인하지 않으면 문제가 다시 온다는 것을,내 가정이다.웠:항상 가까운 결과는 에서 설정을 읽는 메타데이터(일반).

편집(후 오랜 시간):하지만 일반적으로 상기할 수 있는 여전히 사실이 있었다는 또 다른 문제에서 진행되는 코드 사용 종료자 자체입니다.그래서 당신은 래퍼로 연결는 연결을 닫을 때에 종료자 하지만 시키는 연결에 노출되 다른 사람입니다.또 다른 중요한 코딩률:면 귀하의 종료자 닫 자원을 항상 확인을 수 있는 것은 아무것도 없습니다 이러한 리소스에 액세스하지 않고 참조하는 클래스가 포함된다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top