JDBC瘦驱动程序:无效的数据包长度

当我对我的一些Java代码运行自动批量测试时,我遇到了一个奇怪的“无效数据包长度”(这就是拼写错误的方式)错误,我希望有人之前遇到过此错误或者可能指向我正确的方向。

通过JUnitunit testing或从GUI测试我的代码时,我没有遇到此错误。 我在自动批量测试中只遇到此错误。 关于我的批量测试的一点点:对于某些输入,我的代码将运行很长时间(这是预期的),但是为了将结果加速到更合理的时间范围,我正在创建一个新的线程来运行每个个别测试,以便我可以在一些给定的最大经过时间后停止测试。

请注意,测试和实际代码都需要连接到同一个数据库实例才能加载数据。 实际代码使用单个连接从数据库中读取(它不是multithreading的)。 我仍然试图找出测试连接数据库的最佳方法(因此这个问题)。

我的第一个想法是,我正在做一些不友好的事情,因为我关闭我的测试线程以尽早退出运行。 我打电话给被弃用了

threadObject.stop(); 

方法,因为我的实际代码不是multithreading的,没有“友好”的方式来杀死内置的线程。在几个(~2-3)停止线程后,我的JDBC连接抛出一个“Invalid Packet Lenght”错误,然后其他测试的“套接字关闭”exception。

我尝试了所有这些相同的结果:

  • 重用实际代码使用的相同连接
  • 创建一个新连接,并为所有测试重用相同的第二个连接
  • 每次我停止()长时间运行的测试时关闭并重新创建测试连接
  • 为每个测试创建一个新连接(这可以工作,直到我最大化我的连接数)

我已经确定了两个连接,“test”和“actual”,“test”连接是抛出exception的连接。

组态:

  • Eclipse 3.4
  • Java Compliance 1.6
  • ojdbc14_g.jar JDBC驱动程序
  • Oracle 9 DB

我究竟做错了什么? 我应该采用不同的方式处理“测试”连接吗? 我是否需要重新构建我的“实际”连接才能运行批量测试? 导致“无效数据包长度”错误的原因是什么?

我真的不明白你在批量测试中想要完成什么,所以我将提供一些关于线程和Connection的一般建议,我知道:

  1. 也许你的一个线程是在无效状态下保持连接。 线程停止时连接会发生什么? 一般而言,您应该有一个wait() InterruptedException而不是在操作中期停止线程的地方。 无论是否发生exception,都应在finally块中关闭Connection

  2. 如果要为JDBC操作超时,请使用Statement.setQueryTimeout() 。

  3. 考虑使用连接池,如C3P0 。 在代码中设置非常简单,特别是要看一下。 它将负责大部分连接设置/拆卸,并为您的代码提供有效的,随时可用的连接。

  4. 考虑使用Java自己的java.util.concurrent包,而不是推出自己的执行策略。 查看Executors和ExecutorService类 – 它们提供了在单独的线程中执行任务并设置超时的方法。

希望有些帮助。