一、问题
有一次线上系统运行过程中,爆出更新数据库死锁的异常,联系DBA排查原因:在批量更新库存时,发生死锁。
二、解决方案
对调用DAL API的参数List进行排序,保证获取资源的顺序一致,从而避免数据库死锁,于是就有了这篇blog。
三、利用java.List.Collections对List排序
1. 待排序的POJO类,OfferSaleItemStatDAOUpdateParam.java:
public class OfferSaleItemStatDAOUpdateParam { /** * 排序条件1 */ private Long offerId; /** * 排序条件2 */ private String specId; /** * 当前变化的订购数量,即detA值 */ private Long orderAmount; .. 忽略get and set method ... public String toString() { return ToStringBuilder.reflectionToString(this); }
2. 编写比较器OfferSaleItemStatDAOUpdateParamComparator,继承了Comparator接口:
public class OfferSaleItemStatDAOUpdateParamComparator implements Comparator<OfferSaleItemStatDAOUpdateParam> { /** * <pre> * 1. 先比较offerId * 2. 然后再比较specId * * <pre> */ @Override public int compare(OfferSaleItemStatDAOUpdateParam o1, OfferSaleItemStatDAOUpdateParam o2) { if (o1 == null || o1.getOfferId() == null || o2 == null || o2.getOfferId() == null) { return 0; } if (o1.getOfferId() < o2.getOfferId()) { return -1; } else if (o1.getOfferId() > o2.getOfferId()) { return 1; } else { String o1SpecId = (o1.getSpecId() == null) ? "" : o1.getSpecId(); String o2SpecId = (o2.getSpecId() == null) ? "" : o2.getSpecId(); int tempResult = o2SpecId.compareTo(o1SpecId); if (tempResult < 0) { return -1; } else if (tempResult > 0) { return 1; } else { return 0; } } } }
3. 测试结果,使用java.List.Collections对List排序
public class OfferSaleItemStatDAOUpdateParamComparatorTest extends JTester { @Test public void testCompare() { OfferSaleItemStatDAOUpdateParamComparator comparator = new OfferSaleItemStatDAOUpdateParamComparator(); OfferSaleItemStatDAOUpdateParam p1 = new OfferSaleItemStatDAOUpdateParam(); OfferSaleItemStatDAOUpdateParam p2 = new OfferSaleItemStatDAOUpdateParam(); OfferSaleItemStatDAOUpdateParam p3 = new OfferSaleItemStatDAOUpdateParam(); OfferSaleItemStatDAOUpdateParam p4 = new OfferSaleItemStatDAOUpdateParam(); p1.setOfferId(2L); p1.setSpecId("bc"); p2.setOfferId(1L); p2.setSpecId(null); p3.setOfferId(3L); p3.setSpecId("gdf"); p4.setOfferId(3L); p4.setSpecId("ac"); List<OfferSaleItemStatDAOUpdateParam> ll = new ArrayList<OfferSaleItemStatDAOUpdateParam>(); ll.add(p1); ll.add(p2); ll.add(p3); ll.add(p4); Collections.sort(ll, comparator); System.out.println(ll.get(0)); System.out.println(ll.get(1)); System.out.println(ll.get(2)); System.out.println(ll.get(3)); } }
输出结果,可以看出,先按照offerId(数字)进行排序,然后在按照specId(字母)排序:
OfferSaleItemStatDAOUpdateParam@a6d8cb6b[offerId=1,specId=<null>,orderAmount=<null>] OfferSaleItemStatDAOUpdateParam@478e4327[offerId=2,specId=bc,orderAmount=<null>] OfferSaleItemStatDAOUpdateParam@13a78071[offerId=3,specId=gdf,orderAmount=<null>] OfferSaleItemStatDAOUpdateParam@59e184cb[offerId=3,specId=ac,orderAmount=<null>]
相关推荐
当我们需要对List中的元素进行排序时,`Collections.sort()`方法就派上了用场。这个方法能够根据元素的自然顺序或者自定义的比较器进行排序。本文将深入探讨`Collections.sort()`的使用、原理以及如何自定义排序规则...
然后,使用Collections.sort()方法对列表进行排序,使用PriceComparator比较器来比较书籍的价格。 结论: 本文详细介绍了Java中的Collections.sort排序机制,包括Comparator接口的使用和实现机制。通过示例代码,...
Java Collections.sort()实现List排序的默认方法和自定义方法 Java Collections.sort()是Java语言中用于对List进行排序的方法,通过使用这个方法可以对List进行默认排序,也可以根据需要实现自定义的排序规则。 ...
本篇文章将详细探讨如何使用 `Collections.sort()` 对Java List集合进行排序。 首先,`Collections.sort(List<T> list)` 是一个通用的方法,它接受一个List类型的参数,并对其进行排序。排序的标准是基于集合中元素...
Java中的`Arrays.sort()`和`Collections.sort()`是两个常用的排序函数,它们分别用于对数组和集合进行排序。这两个函数在内部实现上有所不同,但都基于高效的排序算法。 首先,`Collections.sort()`方法在处理列表...
在本文中,我们将使用 Java Collections.sort() 排序代码案例来对 Person 对象列表进行排序。 Person 对象有三个属性:名字、ID、年龄。我们将根据年龄从小到大排序,年龄相等时按照名字的字典顺序倒序排序。 代码...
本文将深入探讨如何使用 `Collections` 类对 List 进行排序操作。 首先,让我们了解 `List` 排序的基本概念。在 Java 中,`List` 是接口,它继承了 `Collection` 接口,并添加了顺序相关的操作。常见的 `List` 实现...
本文将深入探讨两种使用Collections.sort方法对List排序的方法。 首先,第一种方法是让List中的对象实现Comparable接口。Comparable接口定义了一个自然排序的规则,使得实现了该接口的类的对象可以进行比较并排序。...
在Java编程语言中,`Collections.sort()` 是一个非常重要的函数,它用于对集合中的元素进行排序。这个函数是 `java.util.Collections` 类的一个静态方法,适用于列表(List)类型的集合。`Collections.sort()` 可以...
在Java编程语言中,`Collections.sort()`方法是一个非常重要的工具,它用于对集合中的元素进行排序。这个方法主要应用于`List`接口的实现类,如`ArrayList`和`LinkedList`等。`Collections.sort()`有两种主要的排序...
在上面的代码中,我们首先创建了一个 Integer 类型的 List,然后使用 Collections.sort 方法对其进行排序。排序后的结果是默认的正序排序。 自定义类的排序 在实际应用中,我们经常需要对自定义类进行排序。...
在示例中,`Collections.sort(list)`按照默认的自然顺序对元素进行排序,使得`list`变为"123", "123", "aaa", "abc", "xyz"。 3. **`Collections.shuffle(List<T> list, Random rnd)`**:这个方法将列表中的元素...
在这个场景下,我们使用`Collections.sort()`函数对一个包含Map对象的List进行排序,然后将排序后的数据适配到ListView中。以下是关于这个主题的详细解释。 **一、Map与List的关系** 在Java中,Map是一种键值对的...
* `Collections.sort(List<T> list)`: 对列表进行自然排序。 * `Collections.sort(List<T> list, Comparator<? super T> c)`: 对列表进行自定义排序。 线程安全操作 Collections 中的线程安全操作方法包括同步和不...
在Java编程中,Collections工具类提供了许多方便的集合操作,其中`sort()`方法是一个非常重要的功能,用于对List类型的集合进行排序。本文将详细介绍`Collections.sort()`方法的两种使用方式及其示例。 ### 一、...
然后,我们可以使用Collections.sort()方法来排序列表。 ```java List<Record> list = new ArrayList(); // 添加记录到列表中 Collections.sort(list); ``` 方法二:使用Comparator接口和Collator类 在Java中,...
`Collections.sort()`是一个通用的方法,可以对List接口的实现类进行排序。在使用这个方法前,确保ArrayList中的元素类型实现了Comparable接口,这样默认按照自然顺序排序;或者提供一个Comparator来定义自定义的...
在这个例子中,我们使用了 SortList 类来对 UserInfo 对象的 userId 字段进行排序。我们可以使用泛型来指定排序的字段,然后使用反射机制来动态地取得方法。 这种方法可以实现对 List 中的对象进行排序,而不需要写...
首先,我们可以使用`Collections.sort()`方法对`List`进行排序。这个方法适用于已经实现了`Comparable`接口的元素类型,例如基本类型或自定义类。`Comparable`接口定义了一个`compareTo()`方法,用于比较类实例的...
Collections.sort 方法可以对 List 对象中的元素进行排序,包括日期字符串。 示例代码 下面是一个使用 Java 进行日期排序的示例代码: import java.util.ArrayList; import java.util.Collections; import java....