1个系统,采用了Oracle的分布式事务来保证分布式系统的事务一致性,但是,该系统在某次搬迁之后,经常出现分布式事务锁,必须手工查询
select local_tran_id||||state,1 from dba_2pc_pending
来查找发生错误的事务,然后进行强制提交或强制回滚
架构的问题先不说,单单是因为一次搬迁,就导致大量的问题。那必须要找到问题,应用才能恢复正常。
问题可能出在网络防火墙,为了降低防火墙的资源利用率,网络部门设置了如果连接超过半小时,则断开该连接。通过标准程序,已经可以确认此问题。但是,DBLINK是否使用长连接?超时时间是多少?
这里需要引入一个Oralce的功能DCD,具体内容请参见:
Resolving Problems with Connection Idle Timeout With Firewall [ID 257650.1]
Dead Connection Detection (DCD) Explained [ID 151972.1]
其实,就是在sqlnet.ora文件中配置:
sqlnet.expire_time = 10
数字单位为分钟,上面的配置即空闲10分钟后检测连接状态,这个检测是从服务器端主动发起,发送一个10字节的空包。
配置好了,如何测试呢?可以按照Oralce的文档
How to Check if Dead Connection Detection (DCD) is Enabled in 9i ,10g and 11g [ID 395505.1]
来检测,当然,也可以用简单的方式来检测,这里我用tcpdump来从网络层面检测数据库传递情况
tcpdump host 10.199.81.33(服务器IP)
14:14:51.592696 IP 10.199.81.33.ncube-lm > BJS1-012.13179: P 4066:4076(10) ack 3491 win 154
14:14:51.592739 IP BJS1-012.13179 > 10.199.81.33.ncube-lm: . ack 4076 win 176
14:24:51.660498 IP 10.199.81.33.ncube-lm > BJS1-012.13179: P 4076:4086(10) ack 3491 win 154
14:24:51.660540 IP BJS1-012.13179 > 10.199.81.33.ncube-lm: . ack 4086 win 176
14:34:51.736100 IP 10.199.81.33.ncube-lm > BJS1-012.13179: P 4086:4096(10) ack 3491 win 154
14:34:51.736152 IP BJS1-012.13179 > 10.199.81.33.ncube-lm: . ack 4096 win 176
从这几行可以看出,每隔10分钟,服务器端主动发送探测包,这样就可以让连接处于活动状态,避免被防火墙强制断开。
[@more@]
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/19423/viewspace-1060271/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/19423/viewspace-1060271/