oracle jdbc Connection Reset问题

参考:https://community.oracle.com/message/3701989   http://www.tuicool.com/articles/mI3mQrv

oracleJDBC在建立连接时需要一些随机数据用以加密session token之类的东西,在linux上,与之相关的是/dev/random/dev/urandom。

先看熵池,Linux内核熵池,通过搜集键盘,鼠标,中断,磁盘操作来产生随机数据,可以通过以下命令查看当前的熵值:

cat /proc/sys/kernel/random/entropy_avail

在读取时,/dev/random设备会返回小于熵池噪声总数的随机字节。Linux内核熵池,通过搜集键盘,鼠标,中断,磁盘操作来产生随机数据。 /dev/random可生成高随机性的公钥或一次性密码本。若熵池空了,对/dev/random的读操作将会被阻塞,直到收集到了足够的环境噪声为止

/dev/urandom则是一个非阻塞的发生器:dev/random的一个副本是/dev/urandom(”unlocked”,非阻塞的随机数发生器),它会重复使用熵池中的数据以产生伪随机数据。这表示对/dev/urandom的读取操作不会产生阻塞,但其输出的熵可能小于/dev/random的。它可以作为生成较低强度密码的伪随机数生成器,不建议用于生成高强度长期密码。

而这个随机数据源默认用的是/dev/random

由于执行程序的主机没有图形界面只是通过远程ssh进行连接,那么熵值来源就少了两个,如果机器比较空闲则后面两个来源也少了,结果就是等半天来不了一个随机数,可以通过一下命令体验一下,用/dev/random憋出个随机数是多难

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;

就是反复打印当前熵值10万次,当然根据自己测试的结果当熵值到达240+时,可以按ctrl+c终止这个命令,此时再去执行Oracle JDBC程序,就可以连接成功了(保险一点可以等熵值更大时终止命令)。

或者可以删掉/dev/random,然后做软连接

rm /dev/random
ln -s /dev/urandom /dev/random

 

你可能感兴趣的:(oracle jdbc Connection Reset问题)