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.
hibernate4.3 无法获取数据库最新值的更多相关文章
- postman+xmysql实现postman与数据库的交互,获取数据库的值来作为参数进行请求
安装nodejs和npm详细步骤:https://www.runoob.com/nodejs/nodejs-install-setup.html 安装xmysql 执行命令: npm install ...
- [Jacky] 解决Ext.Net GridPanel 选择的行数据刷新后不能获取最新值
选择GridPanel中一行数据,当变更数据时并重新刷新之后不能获取最新值,需通过如下方式获取: var internalId = gridPanel.getSelectionModel().getL ...
- JS中获取数据库中的值
在本次项目中,遇到很多问题,经过努力,都逐步得到解决.静下心来,做一个记录,以供以后学习. 在项目中遇到一个问题,需要在JS中读取数据库中的值,然后再把值返回到页面中,解决方案如下:使用Ajax方法来 ...
- grails项目获取前后台的值
grails项目中前台传值给后台: 加入我有a.gsp这个页面,a.gsp中有如下代码: 姓名:<input type="text" name="xing" ...
- C#获取存储过程返回值和输出参数值的方法
//转自网络,先留个底 1.获取Return返回值 //存储过程 //Create PROCEDURE MYSQL // @a int, // @b int //AS // return @a + @ ...
- 获取数据库表详细信息、存储过程、视图、的sql
select s.[name] + '.' + t.[name] as tablename from sys.tables as t,sys.schemas as s where t.schema_i ...
- jmeter 性能测试 JDBC Request (查询数据库获取数据库数据) 的使用
JDBC Request 这个Sampler可以向数据库发送一个jdbc请求(sql语句),并获取返回的数据库数据进行操作.它经常需要和JDBC Connection Configuration配置原 ...
- 【java 获取数据库信息】获取MySQL或其他数据库的详细信息
1.首先是 通过数据库获取数据表的详细列信息 package com.sxd.mysqlInfo.test; import java.sql.Connection; import java.sql.D ...
- 通过jdbc获取数据库中的表结构
通过jdbc获取数据库中的表结构 主键 各个表字段类型及应用生成实体类 1.JDBC中通过MetaData来获取具体的表的相关信息.可以查询数据库中的有哪些表,表有哪些字段,字段的属性等等.Met ...
随机推荐
- awk的替代先sort 再uniq -c 再sort ,uniq只能队相邻的起作用sort先让之间相邻再sort,最后sort是数量排序
[root@localhost ~]# cat aa.txt |sort|uniq -c|sort -nk1 1 22\ 1 44 1 55\ 1 bb 1 dd 1 ff 1 gg 1 kk 1 o ...
- springmvc搭建环境时报No mapping found for HTTP request with URI [/exam3/welcome] in DispatcherServlet with name 'spring2'
项目是使用spring MVC (1)在浏览器中访问,后台总报错: No mapping found for HTTP request with URI [/exam3/welcome] in Dis ...
- [maven] settings 文件 本地maven仓库
<?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Soft ...
- WPF/SL: lazy loading TreeView
Posted on January 25, 2012 by Matthieu MEZIL 01/26/2012: Code update Imagine the following scenario: ...
- mysql 删除
DROP删表,表结构将删了,当然数据也不存在了 TRUNCATE和DELETE删数据,表结构还在 DELETE可以带条件删除,TRUNCATE是全部删除 DELETE删除会写日志,TRUNCATE不写 ...
- Numpy的array数组和标量之间的运算
矢量化 数组很重要,因为它使你不用编写循环即可对数据执行批量运算.这通常就叫做矢量化(vectorzation) 数组与数组的运算 数组与标量的算术运算
- objective-C 的内存管理之-自动释放池(autorelease pool)
如果一个对象的生命周期显而易见,很容易就知道什么时候该new一个对象,什么时候不再需要使用,这种情况下,直接用手动的retain和release来判定其生死足矣.但是有些时候,想知道某个对象在什么时候 ...
- Spring JDBC更新数据
以下示例将展示如何使用Spring jdbc执行更新数据库表的记录,这里演示如何更新student表中指定条件的记录. 语法: String updateQuery = "update St ...
- e768. 创建单选按钮
// Create an action for each radio button Action action1 = new AbstractAction("RadioButton Labe ...
- python模块之psutil详解
一.psutil模块: 1.psutil是一个跨平台库(http://pythonhosted.org/psutil/)能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等)信息 ...