当前位置: 代码迷 >> J2SE >> public synchronized static 获取序列号如何会主键冲突
  详细解决方案

public synchronized static 获取序列号如何会主键冲突

热度:513   发布时间:2016-04-23 21:04:52.0
public synchronized static 获取序列号怎么会主键冲突
成都的春天总是令人舒服,不过成都的项目令人头疼。最近项目在压力测试,在测试提前还款的时候总是报主键冲突如图:




获取主键的方法写在全局静态方法里面如下代码:

public synchronized static SingleResult getSerno_syn(Service service_,UnikMap nvalues,UnikMap params,DataContext exectx) throws Exception {
SingleResult sr =service_.merge("jbbis.common.function.SerialNum_getCmSerNo", nvalues, params, exectx);
// System.out.println("----------------------getSerno_syn cost: "+(e-s)+" ms");

return sr;
}


service_.merge() 方法里面 做了个查询,然后又做了个update ,所以有主键冲突。
这里可以用数据库的序列来获取主键 ,但是我想证明一下这个方法synchronized是否有错,结果确实令我大跌眼镜。按照我的理解 该getSerno_syn 方法是全局的 ,synchronized 是锁到这个方法上的 ,同一时刻应该只有一个线程进入该方法,就不存在主键冲突,但是为什么呐?请各位大神指导。。。
------解决方案--------------------
楼主真的能确定这个异步标记的参数只是在一个应用里使用了?
------解决方案--------------------
同步原语不会出现问题。
可能产生这种状况的原因,估计有两种:
第一:生成主键的方法,有可能生成了相同的主键。(用一个线程连续调用该方法,看看是否主键冲突)
第二:同时运行了两个以上的当前项目,同一个项目里,由于是同一个类加载器对象,所以,同步原语可确保代码块的互斥执行;不同的类加载器对象(一个JVM多个项目或多个JVM),类文件是相同的,但是加载到JVM中,不被认为是同一个类。
  相关解决方案