当前位置: 首页 > news >正文

oracle connection reset,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

由于执行程序的主机没有图形界面只是通过远程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程序,就可以连接成功了(保险一点可以等熵值更大时终止命令)。虽然不是实用的解决方案,但至少确定了问题所在。为了这个事,人都快奔溃了。

解决方案:

安装一个为提供提供熵的程序包sudo apt-get install haveged

熵池减少原因:

由于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

rngd               0:off    1:off    2:on    3:on    4:on    5:on    6:off

测试是否成功

# dd if=/dev/random of=rnd_file bs=1 count=64

记录了64+0的读入

记录了64+0的写出

64字节(64 B)已复制,0.00069313秒,92.3 kB/秒

相关文章:

  • oracle查询应用语句,Oracle查询语句应用经验总结
  • POE技术简介
  • fedora 安装oracle 12c,Fedora下安装Oracle 11g
  • RIP路由协议及工作原理
  • oracle 注册表修改,Oracle 客户端注册表字符集修改-----解决乱码 .
  • 兵经百言
  • Linux服务器负载均衡宝塔,新版负载均衡教程
  • linux的esp8266编译,ubuntu下esp8266 RTOS SDK编译环境搭建
  • 遍历Symbian某目录下的所有文件
  • linux下密码管理工具,Linux使用密码管理工具pass管理密码的方法
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • linux不同用户python不一样,Ubuntu18.0 解决python虚拟环境中不同用户下或者python多版本环境中指定虚拟环境的使用问题...
  • 也要Apollo了
  • SYMANTEC病毒误报现象处理(Backdoor.haxdoor临时解决方案)
  • linux实验报告 shell,linux基本shell命令实验报告
  • 深入了解以太坊
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【技术性】Search知识
  • CAP 一致性协议及应用解析
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • React组件设计模式(一)
  • socket.io+express实现聊天室的思考(三)
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • SpringCloud集成分布式事务LCN (一)
  • 当SetTimeout遇到了字符串
  • 回顾2016
  • 基于web的全景—— Pannellum小试
  • 漂亮刷新控件-iOS
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 删除表内多余的重复数据
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 学习Vue.js的五个小例子
  • 源码安装memcached和php memcache扩展
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #Linux(帮助手册)
  • #QT项目实战(天气预报)
  • (0)Nginx 功能特性
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (arch)linux 转换文件编码格式
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (day6) 319. 灯泡开关
  • (Note)C++中的继承方式
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (生成器)yield与(迭代器)generator
  • (译)2019年前端性能优化清单 — 下篇
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET Core 中的路径问题