java – 多线程 – 避免和处理数据库死锁
发布时间:2020-05-24 01:35:11 所属栏目:Java 来源:互联网
导读:我正在寻找一个从 Java 6应用程序中处理数据库死锁的好策略;可能会有几个并行线程同时写入同一个表.如果数据库(Ingres RDMBS)检测到死锁,它将随机杀死其中一个会话. 考虑到以下要求,处理死锁情况的可接受技术是什么? 应保留总耗用时间 尽可能小的 杀一个会议
|
我正在寻找一个从 Java 6应用程序中处理数据库死锁的好策略;可能会有几个并行线程同时写入同一个表.如果数据库(Ingres RDMBS)检测到死锁,它将随机杀死其中一个会话. 考虑到以下要求,处理死锁情况的可接受技术是什么? >应保留总耗用时间 到目前为止,我提出的策略是这样的: short attempts = 0;
boolean success = false;
long delayMs = 0;
Random random = new Random();
do {
try {
//insert loads of records in table 'x'
success = true;
} catch (ConcurrencyFailureException e) {
attempts++;
success = false;
delayMs = 1000*attempts+random.nextInt(1000*attempts);
try {
Thread.sleep(delayMs);
} catch (InterruptedException ie) {
}
}
} while (!success);
它可以以任何方式改进吗?例如等待固定数量(幻数)秒. 注意:将使用几种数据库级技术来确保死锁在实践中非常罕见.此外,应用程序将尝试避免调度同时写入同一个表的线程.上述情况只是“最糟糕的情况”. 注意:插入记录的表被组织为堆分区表并且没有索引;每个线程都会在其自己的分区中插入记录. 解决方法常用的方法是某种形式的指数退避.而不是你的1000 *尝试随机aproach,使延迟成为尝试次数的指数函数.这可以确保在前一次或两次尝试中的最小延迟,在这种情况下,您可能只是运气不好而导致死锁,但在以后很明显连接确实很拥挤时会给您带来更大的延迟.当然,另一种方法是尝试安排数据库访问,以便不太可能发生死锁.但是,如果不知道你的查询是什么(以及如何以及何时执行),就不可能说这是否可以完成 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
