我们有一个在Websphere中运行的Java程序,并使用直接使用jdbc (没有Hibernate或JPA)的Oracle数据库。我们的客户正在使用HP Performance Center进行负载测试,但他在负载下偶尔会遇到Oracle“死锁”异常
Caused by: java.sql.SQLException: ORA-00060: deadlock detected while waiting for resource
有没有办法,无论是在代码中还是在外部,当这个异常发生时,强制执行kill -3
时得到的相同类型的线程转储?
发布于 2011-10-24 02:36:19
如果不能自动检测异常发生的时间,那么知道如何枚举线程就没有多大用处。
我们一直都在这么做。我们基本上是在使用:
Thread.setDefaultUncaughtExceptionHandler
当我们的应用程序启动,然后当一个异常发生时,我们转储我们想要的信息:
Map<Thread, StackTraceElement[]> mst = Thread.getAllStackTraces();
Runtime.getRuntime().freeMemory()
/ maxMemory()
/ totalMemory()
用于获取基本内存信息然后,您可以调用许多其他的东西,并获得花哨的东西。例如,我们会自动将崩溃报告(包括完整的堆栈跟踪)发送到等待此类跟踪的服务器。
发布于 2011-10-24 02:29:55
对于当前线程,可以使用Thread.dumpStack()。
对于所有线程,您可以使用Thread.enumerate()获取所有正在运行的线程,并使用dumpStack()处理每个线程,也可以使用Thread.getAllStackTraces()并将它们打印到控制台或任何需要的地方。
要在这些异常发生时发生这种情况,如果你不能在自己的代码中做到这一点,你可以尝试AOP,编写一个代理(如果你使用的是Java 6+),或者你可以在必要时获取SQLException的源代码,将其更改为将堆栈转储到其构造函数中,重新编译并将该类放回引导类路径中。
https://stackoverflow.com/questions/7870764
复制