Oracle JDBC 连接卡死后 Connection Reset
症状:在Linux主机上远程登录,执行一个简单的Oracle的JDBC连接程序(jar包),结果硬生生的卡在了连接建立验证阶段,然后等上几分钟后因为连接超时,连接被远端的Oracle服务器reset,于是报了connection reset exception 原因: 参考:http://www.usn-it.de/index.php/2009/02/20/oracle-11g-jdbc-driver-hangs-blocked-by-devrandom-entropy-pool-empty/ 如参考材料中所述,oracle JDBC在建立连接时需要一些随机数据用以加密session token之类的东西,而这个随机数据源默认用的是/dev/random,如果不是,反正也是一个能让人慢的抓狂的发生源。Linux有个内核熵池(感觉太装B了),通过搜集键盘,鼠标,中断,磁盘操作来产生随机数据,可以通过以下命令查看当前的熵值: cat /proc/sys/kernel/random/entropy_avail
dd if=/dev/random of=rnd_file bs=1 count=64
Linux中还有个随机数发生器,/dev/urandom,如其名字所述,不那么随机的随机发生器,就是伪随机的,当然会快很多。参考资料中给出的把随机源修改为/dev/urandom的方法,即在执行java程序加入命令行参数: -Djava.security.egd=file:///dev/urandom
for i in {1..100000};do cat /proc/sys/kernel/random/entropy_avail;done;
解决方案: 安装一个为提供提供熵的程序包 sudoapt-getinstallhaveged 熵池减少原因: 由于linux内核2.4升级到2.6后减少噪源获取,导致随机数生成量减少,通过使用rngd服务获取硬件噪源,生成随机数,补充熵池。
解决方案: 熵池配置: 查看是否安装 rng-tools(默认系统已经安装) # echo 'EXTRAOPTIONS="--rng-device /dev/urandom"' >/etc/sysconfig/rngd 启动服务: # service rngd start 配置开机启动: # chkconfig rngd on 验证信息: # chkconfig --list rngd
测试是否成功 # dd if=/dev/random of=rnd_file bs=1 count=64 记录了64+0 的读入 记录了64+0 的写出 64字节(64 B)已复制,0.00069313 秒,92.3 kB/秒 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |