【问题标题】:Oracle JDBC No more data to read from socket on RedHat 7.7Oracle JDBC 在 RedHat 7.7 上不再需要从套接字读取数据
【发布时间】:2020-09-12 03:30:01
【问题描述】:

在尝试连接并运行执行时,我从 sql-maven-plugin 收到“没有更多数据可从套接字读取”错误。

问题是我只在运行 RedHat 7.7 的 Jenkins slave 上收到此错误,但在我的 Macbook Pro 上它工作正常。

这不是凭据问题,因为我尝试使用错误的密码并且构建立即失败,但是当凭据正确时,它会卡住一段时间,然后失败并显示“没有更多数据可以从套接字读取”错误。

【问题讨论】:

    标签: java linux oracle kernel


    【解决方案1】:

    免责声明:我正在与 @emanuel502 合作

    添加这个标志解决了这个问题:-Djava.security.egd=file:/dev/urandom

    • 我们需要熵用于安全性(身份验证、TLS)
    • 默认情况下,jvm 使用 /dev/random 作为熵源(=基本上是随机性)
    • 但如果“熵不足”,这个会阻塞,而 /dev/urandom 没有
    • 在非常旧的系统上(Linux 内核 3.16 而当前的内核是 5.6),/dev/random 根本没有足够的熵来使用(有一些工具可以让它变得更好,系统管理员可以安装)
    • 因为我们的 jenkins slave 使用 RedHat 7.7,而 RedHat 仅在主要版本中提供次要/安全更新,而 RedHat 7 是从 2014 年开始的(那时他们可能已经在使用旧内核),我们在内核上3.10,这实际上意味着一个简单的 cat /dev/random 在几个字节后阻塞
    • 有时候,你在尝试的那一刻碰巧有足够的熵,而你看不到任何问题,所以很难调试;在我们的例子中,消息是“没有足够的数据从套接字读取”(仅此而已)。我记得几年前的一个案例,其中 TLS 连接非常慢/由于同样的原因被阻塞。

    我个人的结论:永远不要相信“它是旧的,所以它是稳定的”的东西。在较新的系统上(内核 3.16 来自 2013 年 6 月 30 日),您甚至都不知道这个问题。使用 RedHat(自去年 RedHat 8 推出以来甚至没有升级)在 7 多年前解决了一个问题。 我们为此浪费了几天时间?

    而且我并没有真正学到:4 年前我已经遇到过这个问题,但我认为我这辈子再也见不到这样的系统了,我可以忘记它。

    来源:

    【讨论】:

      猜你喜欢
      • 2017-06-17
      • 2015-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-07
      • 2012-06-26
      • 1970-01-01
      相关资源
      最近更新 更多