hibernate4.3 无法获取数据库最新值

在用ssh框架的时候遇到一个问题(hibernate版本号4.3)

问题描写叙述:web端和应用程序都能够读写数据库。当应用程序改动数据库后。hibernate无法读取最新值,读出来的一直都是旧数据。

网上查找:初步定为是缓存引起,在关闭hibernate 的一级。二级缓存和查询缓存之后。依旧读不到最新值。

清除一级缓存方法:

Hibernate一级缓存又称为“Session的缓存”,是无法关闭的,仅仅能清除刷新,或者随着session的关闭而清除。

Session session = sessionFactory.getCurrentSession();
if (session != null) {
    session.clear(); // internal cache clear
}
Cache cache = sessionFactory.getCache();

if (cache != null) {
    cache.evictAllRegions(); // Evict data from all query regions.
}

当然也能够选择性清除

org.hibernate.Cache.evictCollectionRegions()
org.hibernate.Cache.evictDefaultQueryRegion()
org.hibernate.Cache.evictEntityRegions()
org.hibernate.Cache.evictQueryRegions()
org.hibernate.Cache.evictNaturalIdRegions()

刷新

getSessionFactory().getCurrentSession().flush();

关闭二级缓存和查询缓存方法:

在applicationContext.xml文件里加入下面代码:

<prop key="hibernate.cache.use_second_level_cache">false</prop>   <!--关闭二级缓存 -->
<prop key="hibernate.cache.use_query_cache">false</prop>          <!--关闭查询缓存 -->
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>  <!--设置二级缓存的Provider类 -->
<prop key="hibernate.cache.provider_configuration_file_resource_path">WEB-INF/classes/ehcache.xml</prop>   <!--设置缓存的配置文件路径 -->

以上操作均不能解决这个问题,排除缓存原因,终于定位到事务管理,因为读值的方法存在一个事务中,整个事务过程没有跑完导致无法刷新数据。

解决的方法:在applicationContext.xml文件里将 出问题的方法类移除。问题解决。

參考资料:

Summary: This cache is sometimes not really called a cache. However, in order to implement certain isolation levels the database itself may be caching some query results.

Lifecycle/Scope: This cache is scoped to a single Session/EntityManager. The lifecycle is bound to the transaction lifecycle.

Clearing the cache: No way I know of other than starting a new transaction

What gets cached: Queries and result (if isolation is at repeatable read or serializable level)

On by default: Depends on the default isolation level which comes from the database. By default, MySQL ships with repeatable read isolation and so yes, this is on by default for MySQL.

Turning it on/off: Can be specified when creating the transaction. Can also be changed by changing the default on the database.

Useful Information: Hibernate/JPA doesn‘t really have any control over the operation of this cache other than specifying which isolation level is desired.

Session Level (1st-Level) Cache

Summary: This cache is the EntityManager/Session cache. I believe this is also what is referred to as the persistence context.

Lifecycle/Scope: This cache is scoped to a single Session/EntityManager. The lifecycle is bound to the transaction lifecycle.

Clearing the cache: Calling clear() on
the EntityManager or Session clears the entire cache. Calling evict() on
the Session clears a single object from the cache.

What gets cached: Everything

On by default: Yes

Turning it on/off: Can‘t be turned off

Useful Information: This cache gets merged with the database whenever flush() is
called. Unless that happens other transactions will not be able to see things in this cache. The best way to guarantee a flush() is
to commit the transaction.

2nd-Level Cache

Summary: This is a secondary cache that can be enabled (usually to try and improve performance).

Lifecycle/Scope: I believe this is bound to the EntityManagerFactory/SessionFactory. Automatic eviction of this cache depends on the cache strategy. In a read-only strategy data is never evicted automatically.
In a read-write or nostrict read-write strategy data will be evicted when the session closes. Not 100% certain of this.

Clearing the cache: You can call getCache().evict(class) to
evict a specific class and getCache().evictAll() to
evict the entire cache. These methods are on the EntityManagerFactory.

What gets cached: You explicitly configure which entities should be cached.

On by default: No

Turning it on/off: Turned on/off in the Hibernate configuration

Useful Information:

Query Cache

Summary: Query Cache is a cache which stores queries, query parameters and results. If the query and query parameters are the same, you can expect the result to be the same.

Lifecycle/Scope: I have no idea when data in this cache is determined to be stale. I believe the scope is at the EntityManagerFactory/SessionFactory level. In addition, Hibernate keeps a list of "last
update by Hibernate" timestamps for each of the tables. Hibernate uses these timestamps to determine if query results are stale and evict stale queries automatically.

Clearing the cache: The evictQueries() method
on the SessionFactory can be used to manually evict the query cache.

What gets cached: Queries and their results

On by default: No

Turning it on/off: Turned on/off in the Hibernate configuration

Useful Information: The query cache only caches entity IDs. It must be used in conjunction with a 2nd-level cache to achieve a true (no DB access)
cache.

缓存清除

缓存机制

时间: 2024-10-27 17:37:10

hibernate4.3 无法获取数据库最新值的相关文章

postman+xmysql实现postman与数据库的交互,获取数据库的值来作为参数进行请求

安装nodejs和npm详细步骤:https://www.runoob.com/nodejs/nodejs-install-setup.html 安装xmysql 执行命令: npm install -g xmysql 启动服务 启动xmysql: xmysql的相关启动参数,可以通过xmysql -h查看 备注:-h,-u,-p,要连接的数据库的信息, -d需要进入的库名 这里注意如果需要测试连接数据库,这个服务不能关闭要一直打开 3.执行sql语句 启动xmysql后,即可通过http://

数据库的值获取过来转换成Json数组的方法

原文出处:http://www.cnblogs.com/jianglan/archive/2011/08/22/2149834.html .cs文件的主要代码: public class User_List //这个类是对应是Extjs的Grid的field里面的,field有几项就写几项 { public int VoteID = 0; public string VoteName = ""; public DateTime SystemDateTime = DateTime.Par

JS中获取数据库中的值

在本次项目中,遇到很多问题,经过努力,都逐步得到解决.静下心来,做一个记录,以供以后学习. 在项目中遇到一个问题,需要在JS中读取数据库中的值,然后再把值返回到页面中,解决方案如下:使用Ajax方法来实现,需要用到ajax.dll(一个ajax技术开发的帮助类库). 实施过程如下: 1.引用Ajax.dll 2.在App_Code写具体的方法,最好单独建立一个类文件,然后写具体方法. public class AjaxMethod www.2cto.com { public AjaxMethod

javaWeb_JDBC_JDBC获取数据库自动生成的主键值

JDBC_JDBC获取数据库自动生成主键值 1.意义: 在操作比较复杂的数据库表以及相关信息的时候,我们需要获取一条记录中的主键值,以便于别的业务逻辑操作该条记录,那么这一个时候 如果是数据库自己生成主键值,那么我们就有必要获取这一个主键值. 2.实现: 使用重载的 prepareStatement(sql, flag)来生成 PreparedStatement 对象,并调用ResultSet rs = preparedStatement.getGeneratedKeys(); 在 Result

C#获取存储过程返回值和输出参数值的方法

//转自网络,先留个底 1.获取Return返回值 //存储过程 //Create PROCEDURE MYSQL // @a int, // @b int //AS // return @a + @b //GO SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString()); conn.Open(); SqlCommand MyCom

通过Hibernate配置获取数据库表的具体信息

/** * 通过Hibernate配置获取数据库表的具体信息 * @author 晚风工作室 www.soservers.com * */ 标签: Hibernate [1].[代码] [Java]代码 跳至 [1] ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 5

通过jdbc获取数据库中的表结构

通过jdbc获取数据库中的表结构 主键 各个表字段类型及应用生成实体类 1.JDBC中通过MetaData来获取具体的表的相关信息.可以查询数据库中的有哪些表,表有哪些字段,字段的属性等等.MetaData中通过一系列getXXX函数,将这些信息存放到ResultSet里面,然后返回给用户.关于MetaData的说明网上也有不少,这里我只是从我自身学习的角度来记录一下简单使用JDBC以及获取数据表相关信息的方法. DatabaseMetaData dbmd = con.getMetaData()

获取数据库时间sql 以及行级锁总结-共享锁-排他锁-死锁

--TRUNC(date,[fmt]) /TRUNC(number[,decimals])SELECT SYSDATE FROM dual;SELECT TRUNC(SYSDATE) FROM dualSELECT TRUNC(12.34524,2) FROM dual;  --12.34SELECT TRUNC(-12.34724,2) FROM dual; --12.34SELECT TRUNC(12.34524,-1) FROM dual; --10--返回当前月的第一天 SELECT T

使用单态(Singleton)模式获取数据库操作对象

开始先介绍下单态模式,也就是单例模式,我们主要区别于Spring中的原型模式,单例模式就是保证一个类只存在一个实例,就是只初始化一次,第一次完成初始化以后,重复使用的时候,返回的都是这个实例,而且不是重新去new一个新的,这就在DAO层中比较常见,我们定义一个工厂类(seesionFactory),不用每次都去New个用,好处在于节省了内存和时间,但是如果你对象里面的属性值已经改变的话,就不适合使用单例了,只能重新New个,我们一般的用法Spring的Action层就是使用这个原型,可以创建多次