JDBC瘦驱动程序:无效的数据包长度[原文如此]

时间:2009-03-23 16:37:22

标签: java oracle testing jdbc

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

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

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

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

threadObject.stop();

方法,因为我的实际代码不是多线程的,没有“友好”的方式来杀死内置的线程。在几个(~2-3)停止的线程之后,我的JDBC连接抛出一个“Invalid Packet Lenght”其余测试的错误后跟“Socket closed”异常。

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

  • 重用与之相同的连接 实际代码使用
  • 创建一个新连接,重用同一个第二个连接 测试
  • 每次停止()时关闭并重新创建测试连接 长期试验
  • 为每个测试创建一个新连接(这一直到我最大化连接数)

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

配置:

  • Eclipse 3.4
  • Java Compliance 1.6
  • ojdbc14_g.jar JDBC Driver
  • Oracle 9 DB

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

1 个答案:

答案 0 :(得分:2)

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

  1. 也许您的一个线程正在使连接处于无效状态。线程停止时连接会发生什么?一般而言,您应该有wait() InterruptedException的位置,而不是在操作中期停止线程。无论是否发生异常,都应在Connection块中关闭finally

  2. 如果您希望JDBC操作超时,请使用Statement.setQueryTimeout()

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

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

  5. 希望其中一些有用。