问题出现的背景:
最近在写一个项目的代码时,出现了一个问题,项目(Spring Boot项目)打包后放在Linux服务器执行启动脚本时,发现数据库连接池在创建数据连接时总被服务端重置,导致项目无法启动,具体的异常信息下。
问题排查:
依照之前的经验,出现这个问题后对以下几点进行了排查,最后发现都没有解决这个问题。
1.检查数据库连接池、数据库驱动依赖包的版本;
2.检查数据库连接池、数据库驱动的配置是否正确;
3.检查数据库会话,看应用启动是否成功连接到数据库;
问题产生的原因:
最后经过分析与查阅资料,最后发现这个异常在本问题中与依赖包和代码的正确性没有直接关系,而是与Linux的操作系统有关。
问题产生的原因是Oracle JDBC在建立连接时需要一些随机数据用以加密session token之类的参数,在Linux操作系统上则是调用了与之相关的是/dev/random,由于/dev/random在一些条件下会发生堵塞现象,所以导致JDBC连接被重置。
下面科普一下/dev/random与/dev/urandom的差别:
1. /dev/random设备会返回小于熵池噪声总数的随机字节。Linux内核熵池,通过搜集键盘,鼠标,中断,磁盘操作来产生随机数据,若熵池空了,对/dev/random的读操作将会被阻塞,直到收集到了足够的环境噪声为止。
2./dev/urandom则是一个非阻塞的发生器。它会重复使用熵池中的数据以产生伪随机数据,这表示对/dev/urandom的读取操作不会产生阻塞,但其输出的熵可能小于/dev/random。
解决办法:
在项目启动的时候使用参数-Djava.security.egd=file:/dev/../dev/urandom对项目进行启动。
参考文章:
https://community.oracle.com/message/3701989
http://www.cnblogs.com/blfshiye/p/5145621.html
网友评论