Java 有没有办法在Oracle异常上触发jvm线程转储?
我们有一个在Websphere中运行的Java程序,它使用一个使用纯jdbc(无Hibernate或JPA)的Oracle数据库。我们的客户正在使用HP Performance Center进行负载测试,在负载下偶尔会出现Oracle“死锁”异常Java 有没有办法在Oracle异常上触发jvm线程转储?,java,oracle,websphere,deadlock,Java,Oracle,Websphere,Deadlock,我们有一个在Websphere中运行的Java程序,它使用一个使用纯jdbc(无Hibernate或JPA)的Oracle数据库。我们的客户正在使用HP Performance Center进行负载测试,在负载下偶尔会出现Oracle“死锁”异常 Caused by: java.sql.SQLException: ORA-00060: deadlock detected while waiting for resource 有没有一种方法,无论是在代码中还是在外部,当发生此异常时,强制执行与杀
Caused by: java.sql.SQLException: ORA-00060: deadlock detected while waiting for resource
有没有一种方法,无论是在代码中还是在外部,当发生此异常时,强制执行与杀死-3jvm时相同类型的线程转储?对于当前线程,可以使用 对于所有线程,您可以使用获取所有正在运行的线程和每个线程的dumpStack(),也可以使用并将它们打印到控制台或任何需要的地方
为了在这些异常发生时实现这一点,如果您无法在自己的代码中实现,您可以尝试AOP,编写代理(如果您使用的是Java 6+),或者在必要时,获取SQLException的源代码,将其更改为在其构造函数中转储堆栈,重新编译并将该类放回启动类路径,然后再执行其他操作。如果无法在异常发生时自动检测,那么知道如何枚举线程将没有多大用处 我们一直都这样做。我们基本上使用:
Thread.setDefaultUncaughtExceptionHandler
当我们的应用程序启动,然后在出现异常时转储我们想要的信息时:
Map mst=Thread.getAllStackTraces()代码>
/Runtime.getRuntime().freemory()
/maxMemory()
获取基本内存信息totalMemory()
- 用户使用模式(如果是用户可以与之交互的应用程序)
- 自制的“分析”
- 等等
然后你可以打电话给很多其他的东西,然后开始想象。例如,我们将自动向等待此类跟踪的服务器发送崩溃报告(包括完整堆栈跟踪)。+1;我记得当我发现这个小消息时,小灯泡就出现了。
kill-3
以及每个线程的堆栈跟踪都有关于每个线程已经获得和正在等待的锁的信息。Thread.getAllStackTraces()
也有吗?@Paul Tomblin:我不这么认为。我们使用FindDedLockedThreads方法来查找死锁(在支持此调用的JVM上)。