我正在使用JDBC驱动程序进行数据库访问。有时,由于JDBC驱动程序中似乎存在错误,数据库调用会挂起并且不会返回结果。
我正在通过检测挂起并在新线程上重新运行查询来解决此问题。这有效。然而,旧线程并没有消失;它会继续挂起,直到JVM退出。我想清理这些线程,而不是让它们永远卡住。中断JDBC访问线程无效。
这是调用Thread.stop()的情况吗?如果没有,还有什么可以做终止线程吗?
我无法解决根问题,因为我没有JDBC驱动程序的源代码,供应商也不想修复它。
答案 0 :(得分:0)
如果你可以访问线程重复中断应该杀死它。如果这不起作用,则JDBC驱动程序中存在一个主要错误,在这种情况下,停止调用可能是一个(坏)解决方案。
停止的问题是可能没有正确清理资源(如TCP / IP连接)并且可能在后台停留,直到最终系统堵塞并完全失败。
我会尝试强制执行中断以查看是否有任何影响,例如连续中断1000次。如果这没有效果,那么除了调用stop之外你没有任何其他选项,在这种情况下你可能还需要每天或每小时重启。
另一个但也更复杂的解决方案可能是拥有一个额外的进程,它是数据库的简单代理,然后可以安全地重新启动,而不会过多地影响主系统。
答案 1 :(得分:-2)
我们永远不应该使用Thread.stop(),它可能会使线程处于无法管理的状态。 这就是为什么这种方法被Sun所玷污的原因。
使用interrupt()方法的最佳方法,在线程运行方法中我们可以检查isInterrupted(),它将告诉线程是否被中断。如果你的中断执行了一些任务,如果你想要任何一个并且运行方法,那么线程的生命将以更清洁的方式结束。