我们使用1.3.5版本创建了一个 Spring 启动项目。我们的应用程序与Mysql数据库交互。我们创建了一组jpa存储库,在其中使用findAll、findOne和其他自定义查询方法。
我们遇到了一个随机发生的问题。以下是重现该问题的步骤:
1.使用spring-boot应用程序在数据库上触发读取查询。
1.现在使用mysql-console手动更改Mysql中的数据,这些记录是由上述读取查询返回的。
1.使用应用程序再次触发相同的读取查询。
在步骤3之后,我们应该已经收到了步骤2的修改结果,但是我们得到的是修改之前的数据。
现在,如果我们再次使用应用程序触发读取查询,它将为我们提供正确的值。
这个问题是随机发生的。我们没有在应用程序中使用任何类型的缓存。
在调试的时候我发现jpa-repository代码实际上是在调用mysql,并且它也获取了最新的结果,但是当这个调用返回到我们的应用服务时,令人惊讶的是返回值中有旧的数据。
请帮助我们确定可能的原因。
- JPA/数据源配置:**
- 数据源驱动程序类名= com. mysql. jdbc.驱动程序
- 数据源. url = jdbc:mysql://本地主机:3306/数据库名称?自动重新连接= true
- spring.数据源.用户名= root
- Spring数据源密码= xxx
- 数据库平台= org.hibernate.dialect.MySQL5方言
- Spring数据源最大等待时间= 15000
- Spring.数据源.最大活动= 100
- Spring.数据源.最大空闲= 20
- spring.数据源.借用时测试=真
- spring.数据源.删除-已放弃=真
- spring.数据源.删除-放弃-超时= 300
- spring.数据源.默认自动提交=假
- spring.数据源.验证查询= SELECT 1
- Spring数据源验证间隔= 30000
- 方言= org.hibernate.dialect.MySQL5方言
- hibernate.show_sql=false
- hibernate.hbm2ddl.auto=update
服务方式:
@Override
@Transactional
public List<Event> getAllEvent() {
return eventRepository.findAll();
}
JPA存储库:
public interface EventRepository extends JpaRepository<Event, Long> {
List<Event> findAll();
}
4条答案
按热度按时间xu3bshqb1#
示例:
2cmtqfgy2#
这可能是因为一些“脏读”。面对类似的问题,尝试使用事务锁,特别是“可重复读取”,这可能会避免这个问题。纠正我,如果我错了。
cqoc49vn3#
您可以使用
实体管理器. refresh(实体)
获取实体的最新值
8mmmxcuj4#
您可以使用:
则在另一次查询同一实体之前:
然后调用查询