当JBoss AS 5到DB的连接暂时丢失时,我想提出重新连接到MS SQL Server的最佳方法。
对于Oracle,我发现了这个问题:"Is there any way to have the JBoss connection pool reconnect to Oracle when connections go bad?"表示它使用Oracle特定的ping例程,并使用{{}中描述的 valid-connection-checker-class-name 属性。 3}}
我想避免的是每次从池中提取连接时都会运行另一个SQL,这是另一个属性 check-valid-connection-sql 基本上所做的。
所以现在,我倾向于使用 exception-sorter-class-name 的方法,但我不确定这是否是MS SQL Server中最好的方法。
希望听到您对该主题的建议。谢谢!
答案 0 :(得分:1)
我不确定它是否会像您描述的那样(透明地)。
有效的连接检查程序(可以是* ds.xml文件中的sql语句或执行提升的类)是在从池中获取连接时调用的,因为数据库可能已关闭它在游泳池里。如果连接不再有效, 它被关闭,并且从数据库请求一个新的 - 这对于应用程序是完全透明,并且只有在从池中取出连接时才会发生(正如您所说)。然后,您可以在应用程序中长时间使用它。
异常分拣机旨在向应用程序报告,例如, ORA-0815是SQL语句的无害或错误的返回代码。如果它是一个无害的,它基本上被吞下,而对于一个坏的,它被报告给应用程序作为例外。
因此,如果您想使用异常分类器来查找池中的错误连接,您需要做好准备,基本上每个您触发的语句都可能抛出过时连接异常,您需要关闭连接并尝试获得一个新的。这意味着代码中的适当更改,您当然可以这样做。
我认为不时会在数据库中发出一个廉价的sql语句来检查来自池的连接是否仍然有效,这比“手动”进行所有这些检查要便宜得多。
顺便说一句:虽然有通用连接检查程序sql适用于所有数据库,但有些数据库提供了另一种测试连接是否正常的方法; Oracle对此有一个特殊的ping命令,它在您引用的特殊OracleConnectionChecker类中使用。所以可能是MS-SQL有类似的东西,它比简单的SQL语句便宜。
答案 1 :(得分:0)
我成功使用了背景验证属性:来自https://community.jboss.org/wiki/ConfigDataSources
的background-validation-millis
答案 2 :(得分:0)
使用JBoss 5.1(我不知道其他版本),你可以使用
<valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.MSSQLValidConnectionChecker</valid-connection-checker-class-name>