最近碰到了个很有意思的问题,springboot加载多数据源,遇到了在启动时数据库连接报错的问题。

报错信息:

The error occurred while executing a query

然后找到了一篇文章,linux熵池耗尽

http://www.usn-it.de/index.php/2009/02/20/oracle-11g-jdbc-driver-hangs-blocked-by-devrandom-entropy-pool-empty/

在jvm启动参数里加上

-Djava.security.egd=file:/dev/./urandom

就ok了。

可是这是为什么呢?

因为相同环境的多台机器,有些机器有问题,有些机器没问题,排查这个问题耗费了很长时间。

是虚拟机导致的吗?

可以看到,上面那篇博文里是怎么说的:

在无头服务器中,用于(java)应用程序连接的11g JDBC驱动程序可能会造成麻烦。

原因是JDBC 11g需要大约40个字节的安全随机数,从/ dev / random收集,以加密其连接字符串。

为什么这个神秘的“熵池”耗尽了随机数?

我们先去看看。

首先是正常的服务器,执行如下命令:

    cat /proc/sys/kernel/random/entropy_avail
cat /proc/sys/kernel/random/poolsize

接着是报错的那台机器:

为什么entropy_avail就只有189呢?是这个原因吗?

为什么只有189就不能用了呢?

再来看看这篇文章

https://jarfield.iteye.com/blog/1739834

再回来看看oracleJDBC,原来默认情况下,Oracle JDBC 11g似乎会使用/ dev / random。而使用/dev/random生成随机数时,依赖熵池。如果熵池空了或不够用,对/dev/random的读取就会堵塞,直到熵池够用为止。

但是上面这篇文章中说,有得必有失,urandom的随机性弱于random。

这点我也找到了一篇文章,来反驳这种说法,大家可自行围观。

那怎么让熵池增加呢?熵池小会有什么其他后果吗?

jarfield老兄上面那篇文章中说到

熵池本质上是若干字节。/proc/sys/kernel/random/entropy_avail中存储了熵池现在的大小,/proc/sys/kernel/random/poolsize是熵池的最大容量,单位都是bit。如果entropy_avail的值小于要产生的随机数bit数,那么/dev/random就会堵塞。

熵斥怎么增加?

只有少数驱动程序会填充熵池,首先是键盘和鼠标。

实际上是从各种noice source中获取数据,noice source可能是 键盘事件、鼠标事件、设备时钟中等。

linux内核从2.4升级到2.6时,处于安全性的考虑,废弃了一些source。source减少了,熵池补给的速度当然也变慢,进而不够用。

熵斥堵塞会有什么后果?

其实,通过消耗熵池,可以构造DOS攻击。原理很简单,熵池空了,依赖随机数的业务(SSL,加密等)就不能正常进行。

怎么补充熵池?

Linux服务器在运行时,既没有键盘事件,也没有鼠标事件,如何快速积累熵池呢?

在上面那篇文章中有说到:

例如rngd或rng-tools。

先观察rngd启动前的熵池大小:

    watch cat /proc/sys/kernel/random/entropy_avail

只有100多。

安装rng-tools,参考文章 https://blog.csdn.net/tiantao2012/article/details/78792046。

    yum install rng-tools -y

启动rngd服务

    service rngd start

再看下熵池

飙升到3000多。

哈哈,搞定收工。

最后,是我的星球,哈哈。

多数据源连接Oracle报错,linux熵池耗尽问题的更多相关文章

  1. ORA-28547:(Navicat Premium连接oracle报错)

    1.背景 Navicat Premium连接oracle报 ORA-28547:connection to server failed, probable Oracle Net admin errro ...

  2. mac版本navicat连接oracle报错ORA-21561

    最近电脑更换成mac,很多软件都和win不一样了,正在慢慢适应,连接oracle原来用的客户端是pl/sql develop,蛋疼的是没有了mac版本, 用了navicat,具体设置如下 1.新建连接 ...

  3. Jmeter中连接Oracle报错Cannot create PoolableConnectionFactory

    填坑贴,之前一直用jmeter2.13版本进行oracle测试,今天改为3.2版本,发现按照以往的方法执行测试,JDBC Request结果始终报错:Cannot create PoolableCon ...

  4. kettle连接oracle报错oracle.i18n.text.converter.CharacterConverter.OGS.getInstance(I)Loracle/i18n/text/converter/CharacterConverter

    问题背景1:需要将一张excel中的数据导入到数据库中,并且还有关联转换和去重的处理问题,且此excel表不是固定的,需要写一个脚本 当新的excel拿来的时候,可以直接导入即可.所以我想用kettl ...

  5. vs 调式连接oracle报错问题32,64位问题

    wind8 系统选择项目时生成目标平台选择为X86 报错“System.Exception”类型的未经处理的异常在 WindowsFormsApplication1.exe 中发生 其他信息: 尝试加 ...

  6. centos7 64位系统jdbc连接oracle报错问题

    这两天发生了一个错误,记录下来. 报错如下: ### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could n ...

  7. 解决连接oracle报错 尝试加载Oracle客户端库时引发BadImageFomatException。如果在安装64位Oracle客户端组件的情况下以32位模式运行,将出现此问题的报错。

    最近遇到一个.NET连接Oracle的一个错误,其主要原因是换了一台电脑,在新电脑上运行以前的项目出现了的一个错误,工作环境为vs2017+Oracle 64位,win10系统 这个错误头疼了一天,找 ...

  8. navicat连接oracle报错

    Navicat 连接 Oracle ORA-28547:connection to server failed, probable Oracle Net admin error Navicat for ...

  9. 项目连接oracle报错:listener does not currently know of SID given in connect descriptor

    今天练习用IDEA搭建了一个ssm框架,数据库是oracle,在执行mybatis-generator时,一直报错listener does not currently know of SID giv ...

随机推荐

  1. 719. Find K-th Smallest Pair Distance

    Given an integer array, return the k-th smallest distance among all the pairs. The distance of a pai ...

  2. springMVC常用传参总结

    本文介绍了springMVC常用的传参方式和一些注意的事项,页面表单主要以ajax的形式提交. 本帅是个菜鸡,水平有限,若有什么讲得不对或有补充的地方欢迎各位提意见. 一.传递String类型   1 ...

  3. MongoDb 抛出"Error retrieving nonce"异常

    MongoDb在读取一个数据时抛出此异常, google之后也是只有源码没有任何相关结果, 考虑到之前同样的Db下不同的Collection没有发现此问题, 对比之后发现出错的url为: mongod ...

  4. atcoder057D(组合数模板)

    题目链接:http://abc057.contest.atcoder.jp/tasks/abc057_d 题意:给出n个数,可以选择x~y个数,使其平均值最大,求其最大平均数以及选择方案数. 思路:只 ...

  5. [Xcode 实际操作]九、实用进阶-(32)项目的打包上传和提交审核以及下架处理

    目录:[Swift]Xcode实际操作 本文将演示如何将一个应用程序进行打包上传,并提交审核以及下架处理. 点击项目[DemoApp]->[Build Settings]编译设置->[Pr ...

  6. Xmind8 Pro 思维导图制作软件,傻瓜式安装激活教程

    xmind 是做思维导图的软件?今天有一个以前的同事还在和我要这个软件,当然我支持正版啊 !因为正版好用! 我是一个不爱说废话的人,就顺便分享一下 给大家用! 软件下载地址: 链接:https://p ...

  7. redis-分布式锁2

    https://wudashan.cn/2017/10/23/Redis-Distributed-Lock-Implement/ 站在巨人的肩膀上 本博客使用第三方开源组件Jedis实现Redis客户 ...

  8. math(2018.10.27)

    20%的数据直接暴搜就行,接下来我们考虑哪些数不能够出现在同一个集合中,就连一 条边,我们会发现前

  9. mysql8必知必会6 外键约束 增加 查询 删除 MySQL注释

  10. Java - 怎么通过环境变量来切换jdk版本

    问题与分析 我在本地安装了1.7和1.8两个版本的jdk,此时我的JAVA_HOME环境变量配置的是jdk1.8,在cmd窗口输入java -version发现报错如下: C:\Users\Lewis ...