java - 获取 Threaddump java.lang.Thread.State: BLOCKED (on object monitor) at org.hsqldb.Session.setAutoCommit(Unknown Source)
问题描述
我们在我的 SQL 数据库中使用 Struts2 应用程序。几个月后,我们收到了 Java 线程转储,应用程序停止响应。
线程转储如下:“http-0.0.0.0-8443-98”守护进程prio=10 tid=0x0000000043229000 nid=0x54be waiting for monitor entry [0x00007f8b3b8b0000] java.lang.Thread.State: BLOCKED (on object monitor) at org.hsqldb.Session.setAutoCommit(未知来源)
“http-0.0.0.0-8443-179”守护进程prio=10 tid=0x00007f8b3015c000 nid=0x571f 等待监视器条目[0x00007f8b2faf9000] java.lang.Thread.State: BLOCKED (on object monitor) at org.apache.tomcat.util .net.JioEndpoint.recycleWorkerThread(JioEndpoint.java:724)
“http-0.0.0.0-8443-175”守护进程prio=10 tid=0x00007f8b30163800 nid=0x5713 in Object.wait() [0x00007f8b3443b000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object .wait(本机方法)
“Task-Thread-for-com.mchange.v2.async.ThreadPerTaskAsynchronousRunner@2d2fa195”守护进程 prio=10 tid=0x000000005a06b800 nid=0x5631 等待监视器条目 [0x00007f8b34c4b000] java.lang.Thread.State: BLOCKED(在对象监视器上)在 org.hsqldb.DatabaseManager.getDatabase(未知来源)
“http-0.0.0.0-8443-127”守护进程prio=10 tid=0x000000005c334800 nid=0x54e0 等待监视器条目[0x00007f8b37c76000] java.lang.Thread.State: BLOCKED (on object monitor) at org.hsqldb.Session.execute (来源不明)
“DefaultQuartzScheduler_Worker-3”prio=10 tid=0x00007f8b714d4000 nid=0x5ac6 等待监视器条目 [0x00007f8bed917000] java.lang.Thread.State: BLOCKED(在对象监视器上)在 com.octopus.scheduler.tasks.SyncCertificateActivationThreads.activate(SyncCertificateActivationThreads.爪哇:62)
对于数据库,我们正在使用
public class ConnectionManager {
/* Object stores the value of lock */
private static final Object lock = new Object();
/**
* This method is used to get connection object holding the connection with
* the database. This connection object is created using
*
* @return Connection
*/
public Connection getDBConnection() {
Connection conn = null;
try {
InitialContext initialContext = new InitialContext();
IEntityManager manager = new EntityManager();
String dataSource = manager.getDatsourceInstance(application,
coreProduct);
DataSource ds = (DataSource) initialContext.lookup("java:"
+ dataSource);
if (ds != null) {
conn = ds.getConnection();
}
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
/**
* This method is use to generate the random id.
*
* @return
*/
public String generateId() {
return UUID.randomUUID().toString().substring(0, 13);
}
/**
* This method is use to generate the id which contains the current system
* time.
*
*/
public synchronized String generateNewId() {
String id = "";
synchronized (lock) {
// id = String.valueOf(System.currentTimeMillis());
id = String.valueOf(System.nanoTime());
}
return id;
}
由于这些应用程序停止执行,需要哪些参数、标准、配置来减少此类转储。
解决方案
推荐阅读
- r - 当我们使用多个 geom_bar 时如何添加多个图例?
- spring-boot - 为什么 SpringBoot 应用程序的堆内存使用量不断增加?
- javascript - 为什么 Vue.js 中从挂载钩子发送的 AJAX GET 请求总是忽略浏览器缓存?
- powershell - URL 健康检查 PowerShell 脚本在大多数站点上正确获取 HTTP 200,但在某些站点上不正确的“0”状态代码...API 超时问题?
- c++ - 这个警告“指向算术中使用的函数的指针”是什么意思?
- arrays - 为什么链表叫链表 为什么不链表?
- php - 使用 PHP MVC 框架,未填充从 db 到选择框的选定值
- c - 如何将我的输出从 10.000 更改为 10
- python - Backtrader 给出 IndexError:数组分配索引超出范围
- java - 为什么我需要 Servlet 的映射或注释,而不是 JSP?