java - JDBC 瘦驱动程序 : Invalid Packet Lenght [sic]

标签 java oracle testing jdbc

当我对我的一些 Java 代码运行自动批量测试时,我遇到了一个奇怪的“Invalid Packet Lenght”(错误的拼写方式)错误,我希望有人之前遇到过这个错误或者可以指出我在正确的方向。

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

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

我的第一个想法是,我关闭测试线程以提早退出运行的方式不友好。我正在调用已弃用的

threadObject.stop();

方法,因为我的实际代码不是多线程的,所以没有“友好”的方式来终止内置线程。在几个(~2-3)个线程停止后,我的 JDBC 连接抛出一个“无效的数据包长度”错误后跟其余测试的“套接字关闭”异常。

我已经尝试了所有这些,结果相同:

  • 重复使用与 实际代码使用
  • 创建一个新连接并为所有人重用同一个第二个连接 测试
  • 每次停止时关闭并重新创建测试连接() a 长时间运行的测试
  • 为每个测试创建一个新连接(这一直有效,直到我的连接数达到最大值)

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

配置:

  • eclipse 3.4
  • Java 合规性 1.6
  • ojdbc14_g.jar JDBC 驱动程序
  • Oracle 9 数据库

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

最佳答案

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

  1. 也许您的某个线程使连接处于无效状态。线程停止时连接会发生什么?一般而言,您应该有一个地方可以wait() InterruptedException,而不是在运行中停止线程。 Connection 应该在 finally block 中关闭,无论是否发生异常。

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

  3. 考虑使用连接池,例如 C3P0 .用代码设置真的很容易,看看this尤其。它将处理大部分连接设置/拆卸,并为您的代码提供有效的、随时可用的连接。

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

希望其中一些有所帮助。

关于java - JDBC 瘦驱动程序 : Invalid Packet Lenght [sic],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/674137/

相关文章:

linux - linux环境下oracle如何选择特殊字符

sql - ORA-01427错误,插入到所有行

javascript - 使用 sinon 进行快速中间件函数的 stub 是

Android 和 iOS 测试工具/框架

javascript - 如何 Jest 模拟命名导入?

java - 从 JAVA 字符串中消除以特定字符开头的空格和单词

java - 在字符串中多次匹配某个模式

java - 接口(interface)中构造函数的要求

java - 实时采样模式

sql - 如何使用多个查询选择最高价格