Linux环境下java程序获取oracle数据库连接超时的问题解决

点击上面  免费订阅本账号!

本公众号主要推送javaweb开发相关技术,基础知识点,同时会深入剖析复杂的问题,分享一些优秀的框架,大型项目经验,当今最流行的Javaweb技术,热点科技新闻,招聘信息,生活乐趣等等。点击上方的蓝字,这样您每天可以看到更多的java知识和资讯!完全是免费订阅,请放心关注。

Linux下运行java程序(jdk 1.7),该程序会获取Oracle数据库连接,为了提高处理速度,采用了多个进程并行启动处理,这时,偶尔会发生数据库连接获取超时失败的异常发生.而且windows环境下没有问题.

 

Java代码  

  1. java.sql.SQLException: IO Error: End of TNS data channel  

  2.  at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:458)  

  3.  at oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:546)  

  4.  at oracle.jdbc.driver.T4CConnection.(T4CConnection.java:236)  

  5.  at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)  

  6.   

  7.   

  8. 或者  

  9.   

  10. java.sql.SQLException: IO Error: Connection reset  

  11.  at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:467)  

  12.  at oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:546)  

  13.  at oracle.jdbc.driver.T4CConnection.(T4CConnection.java:236)  

  14.  at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)  

 

解决办法:

       java启动的时候添加启动参数 「-Djava.security.egd=file:/dev/./urandom」

注意:「-Djava.security.egd=file:/dev/urandom」的话,相当于「-Djava.security.egd=file:/dev/random」

 

原因分析

       Oracle的JDBC  driver程序里面在获取db连接的时候用到了java的SecureRandom,来获取随机字节数据流,用来产生随机数,-Djava.security.egd配置的就是随机数据收集伪设备,linux下有两种:

       1./dev/random,利用系统中断来生成随机数据,所以当系统不是很繁忙的时候,中断数很少,那么调用进程就会进入等待状态,直到有足够用的中断数的时候,才会返回随机数,而这时可能已经发生getConnection超时了

       2./dev/urandom,不利用系统中断来生成随机数,所以不会造成调用进程等待

所以,我们的遇到的情况必须使用urandom才行,由于java的bug,即使指定file:/dev/urandom,SecureRandom使用的仍然是random,为了绕过这个bug,我们发现了「-Djava.security.egd=file:/dev/./urandom」这种配置方式,来达到我们使用urandom的目的.

 

 为了验证配置前后的速度,可以用下面的小程序进行对比确认

JRand.java

 

Java代码  

  1. import java.security.SecureRandom;  

  2. class JRand {  

  3.     public static void main(String args[]) throws Exception {  

  4.         System.out.println("Ok: " +  

  5.             SecureRandom.getInstance("SHA1PRNG").nextLong());  

  6.     }  

  7. }  

  8.   

  9.   

  10.   

  11. time java -Djava.security.egd=file:/dev/urandom  JRand  

  12.   

  13. time java -Djava.security.egd=file:/dev/./urandom  JRand  

点击阅读全文阅读"Java WebService 简单实例”


关注方式
★长按二维码,选择“识别图中二维码”进行关注。

 没看够?更多好文在阅读原文

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值