当我对我的一些 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
的一般建议:
也许您的某个线程使连接处于无效状态。线程停止时连接会发生什么?一般而言,您应该有一个地方可以
wait()
InterruptedException
,而不是在运行中停止线程。Connection
应该在finally
block 中关闭,无论是否发生异常。如果您希望 JDBC 操作超时,请使用 Statement.setQueryTimeout() .
考虑使用连接池,例如 C3P0 .用代码设置真的很容易,看看this尤其。它将处理大部分连接设置/拆卸,并为您的代码提供有效的、随时可用的连接。
考虑使用 Java 自己的 java.util.concurrent打包,而不是推出自己的执行策略。看看Executors和 ExecutorService类 - 它们提供在单独的线程中执行任务并设置超时的方法。
希望其中一些有所帮助。
关于java - JDBC 瘦驱动程序 : Invalid Packet Lenght [sic],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/674137/