错误的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的混淆导致应用程序发生故障,非常低级的错误,文档的很多细节值得深入学习。
应用反馈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的混淆导致应用程序发生故障,非常低级的错误,文档的很多细节值得深入学习。
相关文章推荐
- Android应用配置错误导致不能编译--配成系统应用
- redis配置错误导致服务器不能启动
- ibatis的sqlmap配置文件错误导致不能启动
- Android系统wifi之p2p(wifi直连)配置文件权限导致应用不能使用wifi问题
- apache httpd监听端口配置错误导致的网站不能访问
- apache虚拟主机配置错误导致网站不能正常使用session
- linux 中环境变量配置错误导致部分命令不能使用包括vi
- LInux下环境变量配置错误导致不能登录的及命令失效解决方案
- RHEL上fstab配置错误导致不能启动的解决方法
- ibatis的sqlmap配置文件错误导致不能启动
- struts配置result类型为json后导致页面不能访问的错误
- struts配置result类型为json后导致页面不能访问的错误
- LInux下环境变量配置错误导致不能登录的及命令失效解决方案
- linux下环境变量配置错误导致不能登录的及命令失效解决方案
- nginx 配置错误而导致目录遍历漏洞
- IIS8.5关于“ 配置错误 不能在此路径中使用此配置节”的解决办法
- ubuntu下解决由于错误配置分辨率导致黑屏问题
- 微软的Framework导致该内存不能为written或read的错误?
- 如果在IIS中没有将虚拟目录配置为应用程序,则可能导致此错误
- docker环境hosts配置错误导致的tomcat无法正常启动