我在更新表格后,过几秒钟再试图获取数据时,仍然会收到旧数据的奇怪问题。当我再次使用相同的查询获取数据时,几秒钟后我会收到刷新后的数据。基本上,我发现它需要一些时间才能返回新鲜的数据。
我已经从Hibernate中禁用了所有缓存,同时在获取数据时,我使用session.clear()并将查询标记为不可缓存。
我还查看了mysql查询日志,并发现Hibernate正在查询mysql,但我收到的是旧数据。
如何确保在任何给定时间点上,我只接收到刷新后的数据?
以下是我的Hibernate配置文件:
<hibernate-configuration>
<session-factory>
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<property name="show_sql">true</property>
<property name="connection.url">jdbc:mysql://127.0.0.1:4804/aluminidb?autoReconnect=true</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- Example mapping file inclusion -->
<property name="hibernate.cache.use_second_level_cache">false</property>
<property name="hibernate.cache.use_query_cache">false</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<mapping resource="com/alumini/spring/model/Alumini.hbm.xml"/>
<mapping resource="com/alumini/spring/model/Question.hbm.xml"/>
<mapping resource="com/alumini/spring/model/Events.hbm.xml"/>
</session-factory>
以下是获取对象的代码。
@Override
public Alumini login(String email, String password) {
Session session=sessionFactory.openSession();
session.clear();
Transaction t;
try{
t=session.beginTransaction();
Query query = session.getNamedQuery("chkLogIn");
query.setParameter("email",email);
query.setParameter("password",password);
query.setCacheMode(CacheMode.REFRESH);
query.setCacheable(false);
List<Alumini> aluminiList=query.list();
if(aluminiList!=null && aluminiList.size()>0){
System.out.println(aluminiList.get(0).getLastUpdated());
t.commit();
return aluminiList.get(0);
}else{
t.rollback();
return null;
}
}finally{
session.close();
}
}
所以我清除了会话,同时在我的配置中禁用了所有缓存。但是,当我更新记录并在几秒钟内使用上述方法获取记录时,我仍然会收到旧数据一次。之后,它会给我最新的数据。