手动修改数据库的值,hibernate查询还没有显示修改数据原因补充

来源:互联网 发布:国外类似淘宝网站 编辑:程序博客网 时间:2024/05/17 05:09
 

    转问题: 
                 
昨天遇到一个问题,就是我手动改了数据库中的数据,但是我前台页面刷新的时候,不能实现数据的实时更新,还是数据库中原来修改的数据,我想应该是跟事务有关的,因为手动修改数据库的话,没有经过事务的处理,而从前台实现数据库更新的话,是经过事务处理的,不知道我这样理解对不对?希望大神帮忙分析下是什么原因,如果我要实现手动修改数据库,页面实时刷新的话,要怎么修改呢?用的是SSH+JPA+GlassFish服务器,先谢谢大家啦!



             hibernate是采取二级缓存的策略,第一是session级别的缓存,二是sessionfactory级别的缓存,并且默认二级缓存是打开的。读取数据的时候,Hibernate将第一次读取的内容放到了缓存中,若此时有别的应用修改了数据库中的数据,程序再次读取的时候,内容是从缓存中直接获取,先从一级缓存中读,若没有则从二级缓存中读取,则读取的数据为过时的数据。
所以你手动的去修改数据库里面的数据……

 

 

j解决方法1:

一级缓存禁用方法:每询打开一个新的session.
二级缓存禁用方法:在hibernate.cfg.xml的<session-factory> </session-factory>之间加上
<property name="hibernate.cache.use_second_level_cache">false</property>

 

如果不行解决方法2:

问题补充:有可能不是Hibernate缓存的问题!!也有可能是数据库事物隔离级别的原因。
而通过查询   
mysql> SELECT @@global.tx_isolation;
结果:

+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| REPEATABLE-READ       |
+-----------------------+
1 row in set (0.00 sec)

可以知道默认事务隔离级别是可重复读(Repeatable read)t

因此只要修改mysql的事物级别为

mysql> set global transaction isolation level read committed;


    Query OK, 0 rows affected (0.00 sec)

    mysql> set session transaction isolation level read committed;

    Query OK, 0 rows affected (0.00 sec)



这样就不会会造成幻象读(phantom read),所谓幻象读,就是同一个事务内,多次select,可以读取到其他session insert并已经commit的数据,
换句话说就是让事物镜像与其它事物发生同步关系;


在Hibernate中叶可以通过通过增加hibernate.cfg.xml配置文件中
<session-factory>节点下得
    <property name="connection.isolation">2</property><property name="connection.isolation">2</property>
</session-factory>
来修改Mysl数据库的事物隔离级别

 

 

原创粉丝点击