JPA的坑多服务主键重复

配置如下

 @Id
    @GeneratedValue(generator="generator")
	@GenericGenerator(name="generator",strategy="increment")
    @Column(name = "id")
    public Long getId() {
		return id;
	}

 问题就 出在这

由Hibernate从数据库中取出主键的最大值(每个session只取1次),以该值为基础,每次增量为1,在内存中生成主键,不依赖于底层的数据库,因此可以跨数据库。

<id name="id" column="id">

<generator class="increment" />

</id>

Hibernate调用org.hibernate.id.IncrementGenerator类里面的generate()方法,使用select max(idColumnName) from tableName语句获取主键最大值。该方法被声明成了synchronized,所以在一个独立的Java虚拟机内部是没有问题的,然而,在多个JVM同时并发访问数据库select max时就可能取出相同的值,再insert就会发生Dumplicate entry的错误。所以只能有一个Hibernate应用进程访问数据库,否则就可能产生主键冲突,所以不适合多进程并发更新数据库,适合单一进程访问数据库,不能用于群集环境。

官方文档:只有在没有其他进程往同一张表中插入数据时才能使用,在集群下不要使用。

特点:跨数据库,不适合多进程并发更新数据库,适合单一进程访问数据库,不能用于群集环境。

时间: 2024-07-29 12:48:36

JPA的坑多服务主键重复的相关文章

mysql insert 主键 重复问题

转自:http://blog.163.com/[email protected]/blog/static/173131045201222122732435/ mysql中insert into和replace into以及insert ignore用法区别: mysql中常用的三种插入数据的语句: insert into表示插入数据,数据库会检查主键,如果出现重复会报错: replace into表示插入替换数据,需求表中有PrimaryKey,或者unique索引,如果数据库已经存在数据,则用

mysql主键设置成auto_increment时,进行并发性能测试出现主键重复Duplicate entry &#39;xxx&#39; for key &#39;PRIMARY&#39;

mysql主键设置成auto_increment时,进行并发性能测试出现主键重复Duplicate entry 'xxx' for key 'PRIMARY' 解决方法: 在my.cnf的[mysqld]片段中添加设置innodb_autoinc_lock_mode=0 同时注意调大jdbc的活跃链接数,如设置 jdbc.maxActive=300,因为设置innodb_autoinc_lock_mode=0可能导致链接过多. 注意,这种方式只需要在并发性能测试时设置,因为这种方式在插入记录时需

jfinal基本应用 --报主键重复

在使用jfinal 的Model过程中有一个很怪异的问题,发布到服务器上,只要是往表中添加字段,就报主键重复. 1.我添加表的时候调用了 public void create(Map map){ String assocName = (String) map.get("assocName"); String telephone = (String) map.get("telephone"); set(COLLUMNS.ASSOC_NAME, assocName);

mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法

[CSDN下载] Powerdesigner 设计主键code不能重复等问题 [CSDN博客] Oracle中用一个序列给两个表创建主键自增功能的后果 [CSDN博客] MySQL自增主键删除后重复问题 [CSDN博客] mysql 主从复制 双主从复制原理 防止主键重复问题(必看) [CSDN博客] replace into导致mysql自增列导致主键重复问题分析 [CSDN博客] 一个循环更新某库所有表所有非主键列的值方法(sql 2005 & mysql) [CSDN博客] mysql i

分布式部署应用时主从同步时候主键重复

原因: 解决方法: 用redis生成主键 /** * * @Title: getContractId * @user: zzx * @time: 2016年11月15日下午5:36:15 * //DESC 获取订单ID * @param param step:步长 * @return 当前分布式环境下最新ID * @return String 返回类型 * @throws */ public String getContractId(JSONObject param){ int step = p

自增列导致主键重复

有记录进行插入时,自增列产生的值就有可能与已有的记录主键冲突,导致出错.首先想办法解决问题,通过人工调大自增列的值,保证大于表内已有的主键即可,调整后,导数据正常 问题发生的前置条件: 1.mysql复制基于row模式 2.innodb表 3.表含有自增主键,并且含有唯一约束 4.load data infile 采用replace into语法插入数据[遇到重复唯一约束,直接覆盖] 问题发生的原理: 1.主库遇到重复unique约束时,进行replace操作: 2.replace在主库上面实际

lucene 解决主键重复

比如有两条记录Document0:                 id:1   pk                content :hello Document1:                 id :1  pk               content :hello world建立索引用ik分词,建立索引 搜索content 会出现两条记录 解决:使用 QueryFilter进行搜索过滤 Query query = new TermQuery(new Term("content&qu

4、JPA table主键生成策略(在JPA中table策略是首推!!!)

用 table 来生成主键详解 它是在不影响性能情况下,通用性最强的 JPA 主键生成器.这种方法生成主键的策略可以适用于任何数据库,不必担心不同数据库不兼容造成的问题. initialValue不起作用? Hibernate 从 3.2.3 之后引入了两个新的主键生成器 TableGenerator 和 SequenceStyleGenerator.为了保持与旧版本的兼容,这两个新主键生成器在默认情况下不会被启用,而不启用新 TableGenerator 的 Hibernate 在提供 JPA

jpa table主键生成策略

用 table 来生成主键详解 它是在不影响性能情况下,通用性最强的 JPA 主键生成器.这种方法生成主键的策略可以适用于任何数据库,不必担心不同数据库不兼容造成的问题. initialValue不起作用? Hibernate 从 3.2.3 之后引入了两个新的主键生成器 TableGenerator 和 SequenceStyleGenerator.为了保持与旧版本的兼容,这两个新主键生成器在默认情况下不会被启用,而不启用新 TableGenerator 的 Hibernate 在提供 JPA