`
dawuafang
  • 浏览: 1107910 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多
错误的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的混淆导致应用程序发生故障,非常低级的错误,文档的很多细节值得深入学习。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics