spring boot应用程序:jpa查询返回旧数据

时间:2016-08-12 17:13:00

标签: spring jpa spring-boot spring-data-jpa

我们使用1.3.5版本创建了一个spring boot项目。我们的应用程序与Mysql数据库交互。 我们已经创建了一组jpa-repositories,我们在其中使用findAll,findOne和其他自定义查询方法。

我们正面临一个随机发生的问题。以下是重现它的步骤:

  1. 使用spring-boot应用程序在db上触发读取查询。

  2. 现在使用mysql-console手动更改Mysql中的数据,这些记录由上面的读取查询返回。

  3. 再次使用应用程序触发相同的读取查询。

  4. 在第3步之后,我们应该收到第2步的修改结果,但我们得到的是修改前的数据。

    现在,如果我们再次使用应用程序触发读取查询,它会为我们提供正确的值。

    此问题随机发生。我们的应用程序中没有使用任何缓存。

    调试时我发现jpa-repository代码实际上是在调用mysql,它也会获取最新结果,但是当这个调用返回给我们的应用程序服务时,很可能返回值有旧数据。

    请帮助我们确定可能的原因。

    JPA / Datasource config:

    • spring.datasource.driverClassName = com.mysql.jdbc.Driver
    • spring.datasource.url = JDBC:MySQL的://本地主机:3306 / DBNAME autoReconnect的=真
    • spring.datasource.username =根
    • spring.datasource.password = XXX
    • spring.jpa.database平台= org.hibernate.dialect.MySQL5Dialect
    • spring.datasource.max-WAIT = 15000
    • spring.datasource.max活性= 100
    • spring.datasource.max空闲= 20
    • spring.datasource.test上借入=真
    • spring.datasource.remove废弃=真
    • spring.datasource.remove废弃超时= 300
    • spring.datasource.default-自动提交=假
    • spring.datasource.validation-query = SELECT 1
    • spring.datasource.validation间隔= 30000
    • hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
    • hibernate.show_sql =假
    • hibernate.hbm2ddl.auto =更新

    服务方式:

         @Override
        @Transactional
        public List<Event> getAllEvent() {
            return  eventRepository.findAll();
        }
    

    JPARepository:

    public interface EventRepository extends JpaRepository<Event, Long> {
        List<Event> findAll();
    }
    

2 个答案:

答案 0 :(得分:2)

@Cacheable(false)

示例:

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

答案 1 :(得分:0)

这可能是因为一些“脏读”。面临类似的问题,请尝试使用事务锁,尤其是“可重复读取”,这可能可以避免此问题。如果我错了,请纠正我。