您的位置:首页 > 其它

错误的TAF配置导致应用不能重连DB

2013-12-26 19:30 489 查看
错误的TAF配置导致应用不能重连DB:

应用反馈DB连接断开之后,无法自动重连,应用报错:

WARN JDBCExceptionReporter:77 - SQL Error: 17008, SQLState: null

ERROR JDBCExceptionReporter:78 - 关闭的连接

INFO DefaultLoadEventListener:111 - Error performing load command

org.hibernate.exception.GenericJDBCException: Cannot release connection

查看了下应用连接的配置情况,这是应用最初的配置:

hibernate.connection.url=jdbc\:oracle\:thin\:@(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 10.18.11.130)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST = 10.18.11.131)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = XMM)(FAILOVER_MODE =(TYPE
= SESSION)(METHOD = BASIC))))

注意到这里使用了FAILOVER_METHOD这个配置项,但是在官方文档中TNSNAMES.ORA中不存在此配置项,只有FAILOVER_MODE:

FAILOVER_MODE Purpose

To instruct Oracle Net to fail over to a different listener if the first listener fails during run time. Depending upon the configuration, session or any SELECT statements which were in progress are automatically failed over.

This type of failover is called Transparent Application Failover (TAF) and should not be confused with the connect-time failover FAILOVER parameter.

Put this parameter under the CONNECT_DATA parameter.

估计是混淆了配置项(FAILOVER_MODE=>FAILOVER_METHOD)导致应用不能尝试重连。

使用SQL*Plus做了个测试:

实验一:使用FAILOVER_METHOD

testrac =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 10.18.15.169)(PORT = 1521))

(ADDRESS = (PROTOCOL = TCP)(HOST = 10.18.15.170)(PORT = 1521))

)

(CONNECT_DATA =

(SERVICE_NAME = RAC)

(FAILOVER_METHOD = #<===此处使用FAILOVER_METHOD

(TYPE = SESSION)

(METHOD = BASIC)

)

)

)

SQL> select instance_name from v$instance;

INSTANCE_NAME

----------------

rac1

SQL> select instance_name from v$instance; <===模拟rac1实例故障,未能自动重连

select instance_name from v$instance

*

第 1 行出现错误:

ORA-03135: 连接失去联系

SQL> select instance_name from v$instance;

ERROR:

ORA-03114: 未连接到 ORALCE

实验二:使用FAILOVER_MODE

testrac =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 10.18.15.169)(PORT = 1521))

(ADDRESS = (PROTOCOL = TCP)(HOST = 10.18.15.170)(PORT = 1521))

)

(CONNECT_DATA =

(SERVICE_NAME = RAC)

(FAILOVER_MODE = #<===此处使用FAILOVER_MODE

(TYPE = SESSION)

(METHOD = BASIC)

)

)

)

SQL> select instance_name from v$instance;

INSTANCE_NAME

----------------

rac1

SQL> select instance_name from v$instance; <===此处为客户端发现连接已经被断开

select instance_name from v$instance

*

第 1 行出现错误:

ORA-12571: TNS:包写入程序失败

SQL> select instance_name from v$instance; <===自动重连DB

INSTANCE_NAME

----------------

rac2

总结:FAILOVER_METHOD与FAILOVER_MODE的混淆导致应用程序发生故障,非常低级的错误,文档的很多细节值得深入学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: