如有图片不显示,阅读原文
普元产品开发的企业级应用,一般都会使用数据库。在运行环境中,会通过数据源连接池访问数据库。由于存在各种原因,如网络不稳定或暂时中断,会造成数据库连接池中的连接失效,因此,数据库连接池一般需要有数据库重连功能,在数据库连接中断后重新连接数据库。
对于Tomcat、PAS服务器,普元提供了C3P0数据源,默认具有数据库重连功能的。其他应用服务器由于使用的是JNDI数据源,就是使用应用服务器的数据源来实现数据库自动重连。
下面分别描述普元产品支持的其他几种应用服务器的数据源的自动重连设置。
1、JBoss连接池的自动重连
JBoss连接池默认没有设置成自动重连,要设置,需要修改数据源配置文件。
对这个文件要做如下修改:
1)增加失效连接检查类配置,如下:
org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter
< /exception-sorter-class-name>
这个类用来检查连接池中的失效连接,就是连接池中已经和数据库中断的,无效的连接,检查出后,将失效连接移除出连接池,防止用户获取到无效连接。这样,一旦断网了无效的连接会都移出连接池,如果网络恢复,用户就不会获取到无效连接,连接池会重新获取新的数据库连接。
上面的例子针对的是使用的Oracle数据库的,如果针对其他数据库,需要用到的类如下:
数据库类型
类名
Oracle
org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter
DB2
org.jboss.resource.adapter.jdbc.vendor. DB2ExceptionSorter
SQL Server
不需要配置,默认支持
Sybase
org.jboss.resource.adapter.jdbc.vendor. SybaseExceptionSorter
Informix
org.jboss.resource.adapter.jdbc.vendor. InformixExceptionSorter
MySQL
org.jboss.resource.adapter.jdbc.vendor. MySQLExceptionSorter
2)增加测试连接用的SQL语句,如下:
这个是测试连接有效性的测试SQL语句,这是一个可选项,建议写上,不填会执行"select 1"语句,这个如果发生错误,则会执行上面配置的SQL语句,因此建议加上这个配置项。
3)增加新建连接的SQL语句,如下:
这个SQL语句在新建数据库连接时会调用,来测试数据库连接是否有效,如果有效,用户就可以拿到可用的数据库连接。如果数据库断网后,前面两项配置讲无效连接都移出连接池,恢复网络后,用户请求数据库连接,就会调用新建一个数据库连接,这个语句就是提供新建数据库连接后测试用的。
4)设置从数据库获取连接的SQL,如下:
这个SQL在用户从连接池拿到连接时调用,检查连接的有效性。
5)设置获取连接的检查类,配合第四步配置,如下:
org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker
< /valid-connection-checker-class-name>
这个类用来验证数据库连接的有效性,不同数据库的验证类如下:
数据库类型
类名
Oracle
org.jboss.resource.adapter.jdbc.vendor. OracleValidConnectionChecker
SQL Server
org.jboss.resource.adapter.jdbc.vendor.MSSQLValidConnectionChecker
Sybase
不需配置
Informix
不需配置
MySQL
org.jboss.resource.adapter.jdbc.vendor. MySQLValidConnectionChecker
下面是MySQL和SQL Server的自动重连配置(Jboss/server/default/deploy/DefaultDataSource-ds.xml),重点关注红色字体部分:
1)MySQL的自动重连数据源配置:
...
< local-tx-datasource>
< jndi-name>DefaultDataSource
< connection-url>jdbc:mysql://192.168.6.75:3306/hjw
< driver-class>com.mysql.jdbc.Driver
< connection-property>root
< connection-property>root
< min-pool-size>5
< max-pool-size>100
org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter
org.jboss.resource.adapter.jdbc.vendor.MySQLValidConnectionChecker
< /local-tx-datasource>
...
2)SQL Server的自动重连数据源配置:
...
< local-tx-datasource>
< jndi-name>DefaultDataSource
< connection-url>jdbc:sqlserver://192.168.1.21:1433;DatabaseName=myDB
< driver-class>com.microsoft.sqlserver.jdbc.SQLServerDriver
< connection-property>user1
< connection-property>pass1
< min-pool-size>5
< max-pool-size>100
org.jboss.resource.adapter.jdbc.vendor.MSSQLValidConnectionChecker
< /local-tx-datasource>
...
注:SQL Server没有sorter class类,所以不用配置,MySQL、Oracle等就有,需要配置。Sybase和Informix没有checker class,所以也不用配置checker class。
2、WebLogic的数据源自动重连
登陆WebLogic的console控制台应用,选择"services-JDBC--data sources"菜单,修改DefaultDataSource数据源(普元产品默认的数据源名称),选择 "Connection Pool"tab页面,如下:
修改下面的内容,见红圈标注地方:
注意:要能自动重连,必须勾选"Test Connection On Reserve"选项,即保留时测试连接,连接在连接池的时候会每个120秒(如上面第二项配置)测试一下未使用的连接,如果测试不通过,会将失效的连接移出连接池,以避免用户获取到中断或无效的连接。
Test Table Name必须要填写,否则即便勾选了选项也没有用,因为这个设置了测试用的SQL语句,如果这个没有填写,则WebLogic不知道用什么测试连接,也无法检查连接的有效性。这个字段的语法有两个:
注意:语法不要搞错了,这个很重要,否则WebLogic会拼出错误的语句,造成测试SQL异常,如填写"select 1 from dual",原本为执行"select 1 from dual"作为sql语句,但被WebLogic解释成表名,会拼成"select count(*) from select 1 from dual"这样的错误SQL语句,WebLogic不会正确执行这个语句,造成自动重连失败。正确的写法是"SQL select 1 from dual",前面加上SQL就可以了,或写成"dual"。
3、WebSphere的数据库连接池自动重连
用http://ip:9060/ibm/console登陆WebSphere的控制台应用(9060为默认的管理控制台端口),在 "资源-JDBC-数据源"功能修改数据源(默认名称为DefaultDataSource),点击"WebSphere Application Server数据源属性"如下:
进入WebSphere特定的数据源属性配置页面,如下图,勾选"预测试现有合用的连接"和"预测试新连接",并填写重试时间间隔、重试次数,以及测试用的SQL字符串。有了这些选项,客户端拿到连接,或连接池新建连接时,会使用设置的SQL语句测试连接的有效性,将有效的连接给客户端,不会将无效的连接给客户端,这样保证了数据库连接池中的连接中断,网络又连上时,用户可以拿到有效的数据库连接。当然,如果网络不恢复,用户是永远无法拿到可用的数据库连接的。
注:如果是WebSphere 8.5的话,勾选"验证新连接"及"验证现有共用的连接",如下图: