前几天和朋友讨论他遇到的问题:为什么hibernate会插入两条相同的记录(偶尔)?
是这么回事:
有两个表: A表 ,B表 一对一的关系,通过Quartz定时任务轮循A表,如果A表有新记录,则插入一条新记录到B表,如果B表已存在记录则更新此记录;
为什么新插入到B表的数据偶尔会出现两条呢?
还有个奇怪的事,在本地测试永远不会出现两条相同的,放在测试服务器就偶尔会出现。
当时看了仔细看过代码肯定不会有问题,刚开始以为是hibernate持久化引起的,后来在save()方法后调用flush()问题
还是没有解决?
由于刚进公司对公司整个架构也不是太了解,后来去请教架构师,找到问题可能出现集群上,因为测试服务器是集群环境,而本地不是,而在集群环境相当于启动了多个定时任务在做相同的事情,因而出现了这种问题,后来将定时任务提取出来,问题不再出现,问题终于解决。
其实公司原来的定时任务都是放到一个工程,是单独放出来(不在集群环境内)。
问题原因归纳
1.没往集群环境去想,考虑问题不够全面
2.公司没有提前对员工有详细的架构讲解
希望对出现相同问题的朋友有所帮助。
有种更好的方法
A表中加入一个IP字段,集群中各定时任务只执行包含自己IP的记录
这样都互不干扰,很好的运用集群环境.
分享到:
相关推荐
在批量更新时,每 20 条记录就会将缓存中的对象 flush 到数据库中,并释放内存。 总结 使用 Hibernate 批量更新大量数据可以大大提高性能和降低内存占用。通过设置批量抓取大小和定期清除一级缓存,可以避免内存...
在 Hibernate 中,联合主键(Composite Key)是指由两个或多个属性共同构成的主键,这种主键在数据库设计中常见于需要多个字段唯一标识一条记录的情况。在 Hibernate 中设置联合主键通常需要以下几个步骤: 1. **...
在这个实例中,我们将深入探讨如何利用这两个框架实现用户注册功能,即向数据库中插入一条新的用户记录,同时处理时间戳字段。 首先,让我们了解一下Struts和Hibernate。Struts是一个基于MVC(模型-视图-控制器)...
Hibernate的`Iterator`可以在每次请求下一条记录时才从数据库中获取数据,减少了内存占用,但在实际应用中需要根据具体情况选择合适的策略。 - **批量操作**:对于批量创建或更新操作,Hibernate的性能也往往优于...
然后,我们可以使用Session进行CRUD操作,如插入一条新用户记录: ```java Session session = HibernateUtil.getSessionFactory().openSession(); Transaction transaction = session.beginTransaction(); User ...
- 查询操作中,如果只根据联合主键的部分字段进行查询,可能会返回多条记录,因此在设计查询逻辑时需格外小心。 总的来说,Hibernate联合主键的使用为复杂的数据关系提供了强大的支持,但同时也增加了设计和编码的...
上述代码将会为查询结果中的每一条记录加上悲观锁。观察Hibernate生成的SQL语句可以看到`FOR UPDATE`子句的使用,这就是悲观锁的具体实现方式之一。 **Hibernate的锁模式**: - `LockMode.NONE`:不使用任何锁机制...
而`iterate`返回一个迭代器,每次调用`next()`方法时才从数据库中获取一条记录,这种方式叫做分页查询,适合处理大数据量的情况,能有效避免内存溢出。不过,由于`iterate`会进行多次查询,所以对于频繁的写操作,...
- **Delete(删除)**:`delete()`方法用于根据主键删除对象,或通过查询结果删除多条记录。 **5. Hibernate 的缓存机制** Hibernate 提供了两级缓存,第一级缓存是Session级别的,每个Session有自己的缓存;第二...
- **持久化类(Persistent Class)**: 实体类需要被标记为持久化类,这样Hibernate才能识别并管理它们。 - **主键(Primary Key)**: 每个实体都有一个唯一的主键,用于在数据库中唯一标识该记录。 - **Session**:...
- **一对多映射**:一个 Java 类对应多张表或多条记录,通常通过集合属性实现。 - **多对多映射**:两个 Java 类之间存在多对多的关系,通常需要引入中间表进行关联。 ##### 4.2 批量处理 批量处理可以显著减少与...
持久态对象拥有唯一的数据库标识,并且与数据库中的一条记录相对应。在Session的生命周期内,对持久态对象的修改会被跟踪,当调用`flush()`方法时,这些更改会被同步到数据库。如果Session关闭,再打开新的Session,...
它们代表了数据库中的一条记录,但不再受Hibernate的管理。 2. **merge()操作**: - 当你对一个游离态对象调用`merge()`时,Hibernate首先检查该对象的ID。如果ID存在,那么: - 如果数据库中找不到匹配的ID,`...
4. 插入一条记录,此时content字段为空Blob: ```java PreparedStatement pstmt = conn.prepareStatement("insert into tablename(name, content) values(?, empty_blob())"); pstmt.setString(1, "name"); ...
主键是数据库表中唯一标识每条记录的字段。在Hibernate中,@Id注解用于标记实体类中的主键属性,而@GeneratedValue注解则用于定义主键的生成策略,如自增、序列等。 3. **属性映射(Property Mapping)** ...
在 Hibernate 中,如果我们需要批量处理大量数据,例如插入 1000 000 条记录,就会出现 OutOfMemoryException 异常。这是因为 Hibernate 的 Session 有一个一级缓存,会将所有对象存储在内存中。如果不及时清空缓存...
例如,当我们创建一个新的`Student`对象并将其添加到`Class`的`students`集合中时,Hibernate会自动插入一条新的`Student`记录,并更新`Student`的`class_id`字段以匹配`Class`的`id`。 现在,如果我们把`Class`端...
Hibernate支持JTA和JDBC两种事务管理方式,通过Session的beginTransaction()、commit()、rollback()等方法进行事务控制。 八、性能优化 1. 使用预编译的SQL语句(PreparedStatement)提高执行效率。 2. 合理设置...
例如,如果我们有一个实体类,其中只有一个 `Description` 字段被修改,使用 `@DynamicUpdate(true)` 后,Hibernate 会生成一条仅包含 `Description` 字段的更新语句,而不是覆盖整个记录。这提高了效率,确保了资源...
每个实体类的实例对应表中的一条记录。 2. 属性映射:@Id注解表示主键,@GeneratedValue指定主键生成策略。其他字段如@ManyToOne、@OneToOne、@OneToMany、@ManyToMany等处理关联关系。 五、对象状态 Hibernate...