当我对某些Java代码运行自动批量测试时,我遇到了一个奇怪的“无效数据包长度”(这就是拼写错误的方式)错误,我希望有人在遇到此错误之前或者可以指出我在正确的方向。
通过JUnit单元测试或从GUI测试代码时,我没有遇到此错误。我在自动批量测试中只遇到此错误。关于我的批量测试的一点点:对于某些输入,我的代码将运行很长时间(这是预期的),但是为了将结果加速到更合理的时间范围,我正在创建一个新的线程来运行每个个别测试,以便我可以在一段给定的最大经过时间后停止测试。
请注意,测试和实际代码都需要连接到同一个数据库实例才能加载数据。实际代码使用单个连接从数据库中读取(它不是多线程的)。我仍在试图找出测试连接数据库的最佳方法(因此这个问题)。
我的第一个想法是,我正在做一些不友好的事情,因为我关闭我的测试线程以尽早退出运行。我正在调用已弃用的
threadObject.stop();
方法,因为我的实际代码不是多线程的,没有“友好”的方式来杀死内置的线程。在几个(~2-3)停止的线程之后,我的JDBC连接抛出一个“Invalid Packet Lenght”其余测试的错误后跟“Socket closed”异常。
我尝试了所有这些结果相同的结果:
我已经确定了两个连接,“test”和“actual”,“test”连接是抛出异常的连接。
配置:
我做错了什么?我应该采用不同的方式处理“测试”连接吗?我是否需要重新构建我的“实际”连接才能运行批量测试?导致“无效数据包长度”错误的原因是什么?
答案 0 :(得分:2)
我真的不明白你在批量测试中想要完成什么,所以我会提供一些关于线程的一般建议以及我所知道的Connection
:
也许您的一个线程正在使连接处于无效状态。线程停止时连接会发生什么?一般而言,您应该有wait()
InterruptedException
的位置,而不是在操作中期停止线程。无论是否发生异常,都应在Connection
块中关闭finally
。
如果您希望JDBC操作超时,请使用Statement.setQueryTimeout()。
考虑使用连接池,例如C3P0。在代码中设置非常简单,特别是this。它将负责大部分连接设置/拆卸,并为您的代码提供有效的,随时可用的连接。
考虑使用Java自己的java.util.concurrent包,而不是推出自己的执行策略。看看Executors和ExecutorService类 - 它们提供了在单独的线程中执行任务并设置超时的方法。
希望其中一些有用。