Java Glassfish/Toplink和sqljdbc.jar在断开的数据库连接上永远重试

Java Glassfish/Toplink和sqljdbc.jar在断开的数据库连接上永远重试,java,sql-server,jdbc,glassfish,sqljdbc,Java,Sql Server,Jdbc,Glassfish,Sqljdbc,我将Glassfish和Toplink与MS SQL Server一起使用,因此使用sqljdbc4.jar连接到数据库。当数据库不可用(DB服务器关闭)时,CPU使用率会上升到100%,Glassfish会一直尝试连接。我的日志很快被以下消息填满: FINE:TDSChannel(ConnectionID:7)读取失败:连接重置 精细:**SQLException:ConnectionID:7 com.microsoft.sqlserver.jdbc.SQLServerException:Co

我将Glassfish和Toplink与MS SQL Server一起使用,因此使用sqljdbc4.jar连接到数据库。当数据库不可用(DB服务器关闭)时,CPU使用率会上升到100%,Glassfish会一直尝试连接。我的日志很快被以下消息填满:

FINE:TDSChannel(ConnectionID:7)读取失败:连接重置
精细:**SQLException:ConnectionID:7 com.microsoft.sqlserver.jdbc.SQLServerException:Connection-reset-Connection-reset
FINE:com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:1368)com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:1355)com.microsoft.sqlserver.jdbc.TDSChannel.read(IOBuffer.java:1532)com.microsoft.sqlserver.jdbc.TDSReader.readPacket(IOBuffer.java:3274)com.microsoft.sqlserver.jdbc.TDSReader.nextPacket(IOBuffer.java:3227)com.microsoft.sqlserver.jdbc.TDSReader.com.microsoft.sqlserver.jdbc.TDSReader.peek令牌类型(IOBuffer.java:3420)com.microsoft.sqlserver.jdbc.TDSParser.parse(TDSParser.java:50)com.microsoft.sqlserver.jdbc.TDSParser.TDSParser.parse(TDSParser.java:39)com.microsoft.sqlserver.jdbc.SQLServerStatement.processexecutesults(SQLServerStatement.java:1064)com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.processResponse(SQLServerPreparedStatement.java:345)com.microsoft.sqlserver.jdbc.TDSCommand.close(IOBuffer.java:4111)com.microsoft.sqlserver.jdbc.SQLServerStatement.discardLastExecutionResults(SQLServerStatement.java:99)com.microsoft.sqlserver.jdbc.SQLServerStatement.closeInternal(SQLServerStatement.java:592)com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.closeInternal(SQLServerPreparedStatement.java:170)com.microsoft.sqlserver.jdbc.SQLServerStatement.close(SQLServerStatement.java:604)com.sun.gjc.spi.ManagedConnectionFactory.isValidByTableQuery(ManagedConnectionFactory.java:397)com.sun.gjc.spi.ManagedConnectionFactory.isValid(ManagedConnectionFactory.java:297)com.sun.gjc.spi.ManagedConnectionFactory.getInvalidConnections(ManagedConnectionFactory.java:246)com.sun.enterprise.resource.AbstractConnectorAllocator.getInvalidConnections(AbstractConnectorAllocator.java:99)com.sun.enterprise.resource.AbstractResourcePool.removeInvalidResources(AbstractResourcePool.java:1535)com.sun.enterprise.resource.AbstractResourcePool.RemoveInvalidIDlResources(AbstractResourcePool.java:1515)com.sun.enterprise.resource.AbstractResourcePool.resizePool(AbstractResourcePool.java:1448)com.sun.enterprise.resource.AbstractResourcePool$Resizer.run(AbstractResourcePool.java:1610)java.util.TimerThread.mainLoop(Timer.java:512)java.util.TimerThread.run(Timer.java:462)

有没有办法为数据库连接设置重试限制,或者在连接重试之间设置暂停超时


如何让Glassfish抛出异常,而不是尝试永远连接?

我们发现,这似乎是Microsoft在sqljdbc4.jar中的一个错误:


我们发现,这似乎是微软在sqljdbc4.jar中的一个bug:


GlassFish的HADB版免费提供了一个用于MS SQL的DataDirect JDBC驱动程序,可以处理连接重置和关闭

GlassFish的HADB版免费提供了一个用于MS SQL的DataDirect JDBC驱动程序,可以处理连接重置和关闭

FINE: TDSChannel (ConnectionID:7) read failed:Connection reset FINE: *** SQLException:ConnectionID:7 com.microsoft.sqlserver.jdbc.SQLServerException: Connection reset Connection reset FINE: com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:1368)com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:1355)com.microsoft.sqlserver.jdbc.TDSChannel.read(IOBuffer.java:1532)com.microsoft.sqlserver.jdbc.TDSReader.readPacket(IOBuffer.java:3274)com.microsoft.sqlserver.jdbc.TDSReader.nextPacket(IOBuffer.java:3227)com.microsoft.sqlserver.jdbc.TDSReader.ensurePayload(IOBuffer.java:3203)com.microsoft.sqlserver.jdbc.TDSReader.peekTokenType(IOBuffer.java:3420)com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:50)com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:39)com.microsoft.sqlserver.jdbc.SQLServerStatement.processExecuteResults(SQLServerStatement.java:1064)com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.processResponse(SQLServerPreparedStatement.java:345)com.microsoft.sqlserver.jdbc.TDSCommand.close(IOBuffer.java:4111)com.microsoft.sqlserver.jdbc.SQLServerStatement.discardLastExecutionResults(SQLServerStatement.java:99)com.microsoft.sqlserver.jdbc.SQLServerStatement.closeInternal(SQLServerStatement.java:592)com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.closeInternal(SQLServerPreparedStatement.java:170)com.microsoft.sqlserver.jdbc.SQLServerStatement.close(SQLServerStatement.java:604)com.sun.gjc.spi.ManagedConnectionFactory.isValidByTableQuery(ManagedConnectionFactory.java:397)com.sun.gjc.spi.ManagedConnectionFactory.isValid(ManagedConnectionFactory.java:297)com.sun.gjc.spi.ManagedConnectionFactory.getInvalidConnections(ManagedConnectionFactory.java:246)com.sun.enterprise.resource.AbstractConnectorAllocator.getInvalidConnections(AbstractConnectorAllocator.java:99)com.sun.enterprise.resource.AbstractResourcePool.removeInvalidResources(AbstractResourcePool.java:1535)com.sun.enterprise.resource.AbstractResourcePool.removeInvalidAndIdleResources(AbstractResourcePool.java:1515)com.sun.enterprise.resource.AbstractResourcePool.resizePool(AbstractResourcePool.java:1448)com.sun.enterprise.resource.AbstractResourcePool$Resizer.run(AbstractResourcePool.java:1610)java.util.TimerThread.mainLoop(Timer.java:512)java.util.TimerThread.run(Timer.java:462)