【问题标题】:First test in each test suite fails connecting to the DB每个测试套件中的第一个测试无法连接到数据库
【发布时间】:2011-11-10 10:02:37
【问题描述】:

我们正在运行 2000 多个 junit,大多数测试通过 jdbc 调用连接到 Oracle 数据库。由于某些原因,我们很少有测试无法连接到数据库。这是一些背景:

  • 我们正在 CI 服务器中运行测试 - Jenkins
  • ANT 正在运行测试,使用<junit> 任务使用fork="true"
  • 只有少数测试因Could not connect to database 错误而失败,不一致,有时会失败,有时不会。
  • 失败的测试通常是每个测试套件中的第一个测试
  • 也连接到数据库的其余测试不会失败。

到目前为止,我们还没有解决这个问题。 有人遇到过类似的吗?

这是一个堆栈跟踪:

Error Message

Could not connect to database using the connect string jdbc:oracle:thin:R71/R71@abc.def:1521:DB11g
Stacktrace

java.lang.RuntimeException: Could not connect to database using the connect string jdbc:oracle:thin:R71/R71@abc.def:1521:DB11g
    at com.abc.common.dao.JDBCUtils.getThinConnection(JDBCUtils.java:257)
    at com.abc.common.dao.JDBCUtils.getConnection(JDBCUtils.java:115)
    at com.abc.common.dao.JDBCUtils.queryForInt(JDBCUtils.java:714)
    at com.abc.test.utils.MetaDataLanguageDBTest.testMetaDataLanguages(MetaDataLanguageDBTest.java:13)
Caused by: java.sql.SQLRecoverableException: IO Error: Connection reset
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:428)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:536)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:228)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:521)
    at java.sql.DriverManager.getConnection(DriverManager.java:582)
    at java.sql.DriverManager.getConnection(DriverManager.java:207)
    at com.abc.common.dao.JDBCUtils.getThinConnection(JDBCUtils.java:254)
Caused by: java.net.SocketException: Connection reset
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:96)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
    at oracle.net.ns.DataPacket.send(DataPacket.java:199)
    at oracle.net.ns.NetOutputStream.flush(NetOutputStream.java:211)
    at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:227)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:175)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:100)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:85)
    at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:123)
    at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:79)
    at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1122)
    at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1099)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:288)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:191)
    at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:366)
    at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:752)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:366)
Standard Error

java.sql.SQLRecoverableException: IO Error: Connection reset
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:428)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:536)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:228)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:521)
    at java.sql.DriverManager.getConnection(DriverManager.java:582)
    at java.sql.DriverManager.getConnection(DriverManager.java:207)
    at com.abc.common.dao.JDBCUtils.getThinConnection(JDBCUtils.java:254)
    at com.abc.common.dao.JDBCUtils.getConnection(JDBCUtils.java:115)
    at com.abc.common.dao.JDBCUtils.queryForInt(JDBCUtils.java:714)
    at com.abc.test.utils.MetaDataLanguageDBTest.testMetaDataLanguages(MetaDataLanguageDBTest.java:13)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at junit.framework.TestCase.runTest(TestCase.java:154)
    at junit.framework.TestCase.runBare(TestCase.java:127)
    at junit.framework.TestResult$1.protect(TestResult.java:106)
    at junit.framework.TestResult.runProtected(TestResult.java:124)
    at junit.framework.TestResult.run(TestResult.java:109)
    at junit.framework.TestCase.run(TestCase.java:118)
    at junit.framework.TestSuite.runTest(TestSuite.java:208)
    at junit.framework.TestSuite.run(TestSuite.java:203)
    at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:421)
    at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:912)
    at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:766)
Caused by: java.net.SocketException: Connection reset
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:96)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
    at oracle.net.ns.DataPacket.send(DataPacket.java:199)
    at oracle.net.ns.NetOutputStream.flush(NetOutputStream.java:211)
    at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:227)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:175)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:100)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:85)
    at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:123)
    at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:79)
    at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1122)
    at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1099)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:288)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:191)
    at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:366)
    at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:752)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:366)
    ... 25 more

谢谢。

【问题讨论】:

  • 安全提示:我希望服务器/端口不能从互联网访问,否则你刚刚向全世界广播了如何登录到你的数据库。
  • 谢谢 :) 但我用了一个假的连接字符串,编的。
  • 每个测试是创建自己的连接还是使用数据源?
  • @Kevin 每个测试都创建自己的连接

标签: oracle ant jdbc junit hudson


【解决方案1】:

我知道这个问题已经很老了,但我也遇到了同样的问题。我的解决方案是将以下环境变量添加到我的测试中:

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

简而言之,Oracle JDBC 驱动程序默认使用/dev/random,如果系统上没有足够的熵,它会阻塞。完整的解释可以在this answer找到。

【讨论】:

    【解决方案2】:

    可能是您的连接用完了。我会尝试使用由连接池支持的数据源。

    【讨论】:

    • 它是否解释了为什么第一个测试总是失败而其余的测试通过?你说的可能是对的,但在这个阶段适应这种方法对我来说更复杂。我虽然这可能与测试在 fork="true" 中运行的事实有关
    • 哦,我没有注意到这一点。是的,听起来连接太多可能不是问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2012-11-03
    • 2018-10-01
    • 2015-06-27
    • 1970-01-01
    • 2021-05-13
    • 2019-01-07
    相关资源
    最近更新 更多