Spring Boot 应用:jpa查询返回旧数据

ui7jx7zq  于 2023-02-28  发布在  Spring
关注(0)|答案(4)|浏览(343)

我们使用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();
}
xu3bshqb

xu3bshqb1#

@Cacheable(false)

示例:

@Entity
@Table(name="table_name")
@Cacheable(false)
public class EntityName {
    // ...
}
2cmtqfgy

2cmtqfgy2#

这可能是因为一些“脏读”。面对类似的问题,尝试使用事务锁,特别是“可重复读取”,这可能会避免这个问题。纠正我,如果我错了。

cqoc49vn

cqoc49vn3#

您可以使用
实体管理器. refresh(实体)
获取实体的最新值

8mmmxcuj

8mmmxcuj4#

您可以使用:

@Autowired
private EntityManager entityManager;

则在另一次查询同一实体之前:

entityManager.clear();

然后调用查询

相关问题