最近遇到一个informix数据库的问题:数据库的一张表的主键id是serial8类型的,表是行锁模式(建表的时候有lock mode row;)。该字段的值在数据插入的时候,系统自动生成。因为放入这张表的数据量比较大,我们采用批量插入的方式对其进行数据插入(PreparedStatement psm ,先把一定量数据psm.addBatch(); 然后 psm.executeBatch()执行一次)。
在这种方式下,单线程没有问题,因为我们需要把实时和批量数据分开进行插入,所以有实时数据和批量数据有两个线程进行插入数据,在这种情况下压力测试,发现有少量的主键重复的情况。目前怀疑的地方有两点:
一: serial8自动生成的时候有问题。
二: 批量插入的方式(psm.executeBatch())有问题。
下面是出错的日志:
java.sql.BatchUpdateException: Unique constraint (eibs1.u134_72) violated.
java.sql.BatchUpdateException: Unique constraint (eibs1.u134_72) violated.
java.sql.BatchUpdateException: Unique constraint (eibs1.u134_72) violated.
没有找到比较有效的资料,还请各位大侠多多指教。谢谢!
------解决方案--------------------------------------------------------
1, 加入mt_id,value 为0 试试
2,有没有触发器?有没有begin tran/lock一类的代码
3,serial8 没有bigserial好用