- 浏览: 465264 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (111)
- 数据库 (8)
- java (24)
- BI (1)
- tomcat (3)
- javascript/css (8)
- 服务架构 (1)
- mule (6)
- cas (4)
- mondrian (4)
- webservice (1)
- SOA (3)
- Lucene/HibernateSearch (2)
- Linux (15)
- 操作系统 (3)
- hibernate (2)
- jbpm (1)
- apache (1)
- phpstudy (1)
- hadoop (27)
- hive (7)
- hbase (8)
- svn (1)
- eclipse (3)
- mahout (1)
- mail (1)
- oracle (1)
- mysql (4)
- axis2 (1)
- python (2)
- kafka (1)
- lucene (1)
- nutch (1)
- spark (2)
- idea (2)
- flume (0)
- ubuntu (1)
- pheonix (2)
- drill (2)
- tez (4)
- pig (1)
- tensorflow (1)
最新评论
-
zhangyou1010:
zhangyou1010 写道请教,我执行mount -t n ...
NFS挂载hdfs到本地 -
zhangyou1010:
请教,我执行mount -t nfs -o vers=3,pr ...
NFS挂载hdfs到本地 -
hengfengyiyingdong:
为什么我查出来的hbase数据都是base64编码的? 我保存 ...
apache drill 0.8.0 单机/分布式安装测试 -
107x:
不错,谢谢!
Hive metastore三种存储方式 -
duguyiren3476:
确实不怎么快,httpfs的上传你可以理解为普通的httpup ...
hadoop2.5.2配置httpfs服务
首先介绍get()和load()方法的区别:
get()方法和load()方法的区别主要在于对二级缓存的使用上。
load()方法会使用二级缓存,而get()方法在一级缓存没有找到会直接查询数据库,不会去二级缓存中查找。
get():如果在数据库中没有记录会返回空,get()无论如何都会返回数据.
load():如果数据库中没有记录会抛出异常,如果有数据返回的是一个代理对象。
get()方法默认不支持lazy(延迟加载)功能,而load支持延迟加载
get()方法在查询不到数据时,返回null,而load因为支持延迟加载,只有在使用对象时才加载,所以如果数据库中不在数据load会抛出异常(org.hibernate.ObjectNotFoundException)。
get()和load()只根据主键查询,不能根据其它字段查询,如果想根据非主键查询,可以使用HQL
list和iterator()方法之间的区别:(N+1?)
list()方法在执行时,直接运行查询结果所需要的查询语句。
iterator()方法则是先执行得到对象ID的查询,然后在根据每个ID值去取得所要查询的对象。
因此:对于list()方式的查询通常只会执行一个SQL语句,而对于iterator()方法的查询则可能需要执行N+1条SQL语句(N为结果集中的记录数).
结果集的处理方法不同:
list()方法会一次活的所有的结果集对象,而且他会依据查询的结果初始化所有的结果集对象。如果在结果集非常庞大的时候会占据非常多的内存,甚至会造成内存溢出的情况发生。
iterator()方法在执行时不会一次初始化所有的对象,而是根据对结果集的访问情况来初始化对象。一次在访问中可以控制缓存中对象的数量,以避免占用过多的缓存,导致内存溢出情况的发生。
HQL:HQL是一种面向对象的查询语言,HQL的操作对象是类、实例和属性等。
SQL:sql的操作对象是数据表和列等数据对象。
Hql是完全面向对象的查询语言,因此可以支持继承和多条等特征。
HQL查询依赖于Query类,每个Query实例对应一个查询对象。
定参数的功能,Query 接口才是真正的HQL查询接口。
//创建一个Query 对象
- Query query = session.createQuery ("from Customer as c where c.name=:customerName and c.age=:customerAge" );
//动态绑定参数
//执行查询语句,返回结果
HQL查询步骤:
1:获取Hibernate Session对象。
2:编写HQL语句。
3:以HQL语句作为参数,调用Session的createQuery方法创建查询对象。
4:如果HQL语句包含参数,调用Query的setXXX()方法为参数赋值。
5: 调用Query对象的list等方法遍历查询结果。
Query还包含两个方法:
- setFirstResult(int firstResult)://设置返回的结果集从第几条记录开始。
- setMaxResults(int maxResults)://设置本次查询返回的结果数。
实体的删除和更新。
投影查询:只查询属性的一部分。
查询一个属性返回的是字符串
查询二个字段返回的是数组
动态构造查询:主要用于几十个表查询;
要构建一个新的对象,要加上一个构造函数;
在new对象的时候要加上包名
不要使用count(*) 要count(持久化对象)
分组与排序:
Order by子句可以通过asc或desc关键字排序
如:
Group by子句与统计查询:
如:
- String hql = "select count(u),u.age from User u group by u.age having count(u)>10" ;
- List list = session.createQuery(hql).list();
标准的SQL聚合函数都可以在HQL语句中使用,比如:count(),sum(),max(),min(),age()等
连接查询:
内连接:inner join
左外连接:left outer join
右外连接:right outer join
全连接:full join(不常用)
迫切外连接:left outer join fetch,left join
fetch:用于一次性获取连接数据,特别是集合数据。减少与数据库交互的次数。
left out join:使用做外连接位于left join 左侧表的所有记录及对应的order类的记录信息都将显示出来。
right out join:与 left out join 正好相反,right out join 返回的是HQL右侧表中的所有记录以及对应的Customer对象记录信息。
获取集合数据的四种方式:
1:Hibernate.initialize(user.getOrder());
2:user.getOrder().size();
3:左右迫切连接
4:高级过滤器
条件查询语句(Criteria Queries):利用对象进行对象查询。
主要的接口有:Criteria、Criterion和expression_r和Restrictions类组成。能够支持在运行时动态生成SQL语句。
条件查询步骤:
1:通过seesion的CreateCriteria()方法,创建一个Criteria对象
2:设置查询对象,name指对象的属性
3:把查询条件添加到Criteria对象中
4:执行list()查询返回结果。
条件查询通过三个类完成:
Criteria:代表一次查询.
Criterion:代表一个查询条件.
Restrictions:产生查询条件的工具类.
本地sql查询:使用手写的SQL来完成所有的create\update\delete操作也包括存储过程
本地sql步骤:
1:通过session创建一个SqlQuery对象。
2:编写sql语句
3:以SQL语句作为参数,调用Session的createSQLQuery方法创建查询对象
4:如果SQL语句包含参数,则调用Query的setXX方法为参数赋值
5:调用SQLQuery对象的addEntity或addScalar方法,将选出的结果与实体或标量值关联.
如:HQL的sql
注意:如果使用*,表的别名和类的别名要一致
如:条件查询的sql
多态查询:
多态查询是指可以查询到当前类及所有子类的实例,HQL和条件查询都支持多态查询。
如:hql语句查询出所有的持久化对象
- Query query = session.createQuery("from java.lang.object" );
- System.out.println(query.list());
HQL支持多态查询,多态查询是指查询出当前类及所有子类的实例,
session.createQuery("from Employee"); or session.createCriteria(Employee.class);
如果Employee类有两个子类:HourlyEmployee和SalariedEmployee,那么这个查询语句会查出所有的Employee实例,以及HourlyEmployee类和SalariedEmployee类的实例。
- session.createQuery("from HourlyEmployee" );
- session.createCriteria(HourlyEmployee.class );//只检索子类
查询结果集排序:
Hql与条件查询都支持查询结果集排序,只是HQL采用Order by关键字,而条件查询采用order类进行查询结果排序。
分页查询:
分页查询是数据库应用中常见的处理方式,Query和Criteia接口都提供了用于分页查询的方法.
子查询:
1:查询有一个订单以上的客户。
如:
hql子查询依赖于底层数据库 对子查询支持的能力。
所有的子查询可以使用连接查询和分组查询语句来代替。
如:
如果子查询返回多条记录,可以使用关键字量化:
1:all 2:any 3:some 4:in 5:exists
如:
- //返回所有订单价格小于100的客户
- from Customer c where 100 >all(select o.price form c.orders o)
- //返回有一条订单的价格小于100的客户
- from Customer c where 100 >any(select o.price from c.orders o)
- //返回有一条订单的价格等于100的客户
- from Customer c where 100 =some(select o.price from c.order o)
- //返回有一条订单的价格等于100的客户
- from Customer c where 100 = any (select o.prive from c.orders o)
- //返回有一条订单的价格等于100的客户
- from Customer c where 100 in (select o.price from c.orders o)
参数绑定:
1:传统的JDBC的参数绑定
如:
- PrepareStatement pre = connection.prepare("select * from User where user.name = ?" );
- pre.setString(1 ,"Zhao" );
- ResultSet rs = pre.executeQuery();
Hibernate参数绑定:在hibernate中有4种参数绑定方式
1:按参数名称(命名参数)绑定,在语句中定义命名参数要用":"开头
2:按参数位置绑定
3:Hql查询中可以通过setParameter()方法绑定任意类型的参数
4:setProperties()方法,将命名参数与一个对象的属性值绑定在一起
如:参数":"开头
- Query query = session.createQuery("from User user where user.name = customername and user.age = :customerage" );
- query.setString("customername" ,name);
- query.setInteger("customerage" ,age);
如:参数位置绑定
- Query query = session.createQuery("from User user where user.name =? and user.age = ?" );
- query.setString(0 ,name);
- query.setInteger(1 ,age);
如:setParameter他有三个参数一般写两个参数
- String hql = "from User user where user.name = :customername" ;
- Query query = session.createQuery(hql);
- query.setParameter("customername" ,name,Hibernate.STRING);
如:setProperties
- Customer customer = new Customer();
- customer.setName("sdsd" );
- customer.setAge(99 );
- Query query = session.createQuery("from Customer c where c.name=:name and c.age = :age" );
- query.setProperties(customer);
定义命名查询:
命名的SQL语句不是放在程序中,而是放在配置文件中,这种方式是以松耦合的方式配置SQL语句,可以提高程序解耦.
在Customer.hbm.xml配置文件中
程序中的代码:
- Query query = session.getNamedQuery("findCustomer" );
- query.setString("name" ,"tiger" );
- List list = query.list();
命名的SQL语句:
- <sql-query name="mysqlquery" >
- <!-- 关联返回的结果与实体类 -->
- <return alias="s" class ="com.lovo.po.Customer" >
- <!-- 定义命名SQL查询的SQL语句 -->
- select {c.*}
- from Customer Customer c where c.name like "刘德华"
- </sql-query>
sql_query是hibernate-mapping元素的子元素,因此可以直接通过session访问
缓存是位于应用程序与物理数据源之间,用于临时存放复制数据的内存区域,
目的是为了减少应用程序对物理数据源访问的次数,从而提高应用程序的运行性能.
Hibernate在查询数据时,首先到缓存中去查找,如果找到就直接使用,找不到的时候
就会从物理数据源中检索,所以,把频繁使用的数据加载到缓存区后,就可以大大减少应
用程序对物理数据源的访问,使得程序的运行性能明显的提升.
缓存分两级,一级session缓存,就是常说的一级缓存;二级应用缓存(二级缓存);
一级缓存,一级缓存依赖于session,在一个session中就是一个缓存,当session失效时,缓存消失。
/**两个session两次加载**/
- public void loadBookAgain(){
- Session session = HibernateSessionFactory.getSession();
- Book book1 = (Book) session.get(Book.class , 6 );
- Book book2 = (Book) session.get(Book.class , 6 );
- session.close();
- // Session session1 = HibernateSessionFactory.getSession();
- // Book book2 = (Book) session1.get(Book.class, 6);
- // session1.close();
- }
在一个session里面查询两次相同的book,只会执行一次sql。
但若放在不同的session中,将会执行两次数据库查询。
解决问题的办法就是用二级缓存。
二级缓存是SessionFactory级别的全局缓存,它底下可以使用不同的缓存类库,比如ehcache、oscache等。
参考
http://www.javaeye.com/topic/249465
不是所有的数据都适合放在二级缓存中
下面这几种情况就不适合加载到二级缓存中:
1.经常被修改的数据
2.绝对不允许出现并发访问的数据
3.与其他应用共享的数据
下面这己种情况合适加载到二级缓存中:
1.数据更新频率低
2.允许偶尔出现并发问题的非重要数据
3.不会被并发访问的数据
4.常量数据
5.不会被第三方修改的数据
配置二级缓存比较简单,以ehcache为例:
添加缓存文件ehcache-hibernate-local.xml
- <?xml version="1.0" encoding="UTF-8" ?>
- <ehcache>
- <diskStore path="java.io.tmpdir/hibernate/book" />
- <defaultCache maxElementsInMemory="10000" overflowToDisk="true" eternal="false"
- memoryStoreEvictionPolicy="LRU" maxElementsOnDisk="10000000"
- diskExpiryThreadIntervalSeconds="600"
- timeToIdleSeconds="3600" timeToLiveSeconds="100000" diskPersistent="false" />
- <!-- Special objects setting. -->
- <cache name="bean.entity.Book" maxElementsInMemory="500" overflowToDisk="true"
- eternal="true" >
- </cache>
- </ehcache>
maxElementsInMemory为缓存对象的最大数目,
eternal设置是否永远不过期,
timeToIdleSeconds对象处于空闲状态的最多秒数,
timeToLiveSeconds对象处于缓存状态的最多秒数 。
在实体bean的hbm.xml文件中加上缓存配置:
- <!-- 设置该持久化类的二级缓存并发访问策略 read-only read-write
- nonstrict-read-write transactional-->
- <cache usage="read-write" />
现在大部分的hibernate应用不再写实体映射配置文件,那么就在实体bean中加上
//默认的缓存策略.
在hibernate定义sessionFactory中加上查询缓存配置:
<!-- 设置二级缓存插件EHCache的Provider类-->
- <property name="hibernate.cache.provider_class" >
- org.hibernate.cache.EhCacheProvider
- </property>
<!-- 启动"查询缓存" -->
- <property name="hibernate.cache.use_query_cache" >true </property>
- <property
- name="hibernate.cache.provider_configuration_file_resource_path" >
- /ehcache-hibernate-local.xml
- </property>
如果项目试用了spring,那么相应配置为:
- <property name="hibernateProperties" >
- <props>
- <prop key="hibernate.dialect" >${hibernate.dialect}</prop>
- <prop key="hibernate.show_sql" >${hibernate.show_sql}</prop>
- <prop key="hibernate.format_sql" >${hibernate.format_sql}</prop>
- <prop key="hibernate.cache.provider_class" >org.hibernate.cache.EhCacheProvider</prop>
- <prop key="hibernate.cache.provider_configuration_file_resource_path" >/ehcache-hibernate-local.xml</prop>
- </props>
- </property>
两种配置基本一致。
这个时候在按实体的ID来查询的时候即使不在一个session中,hibernate也只是执行一次sql。
查询缓存做到现在,有一点效果,但基本还是个摆设。
看下面代码:
- public void listBookTwice(){
- String hql = "from Book" ;
- Session session = HibernateSessionFactory.getSession();
- Query q = session.createQuery(hql);
- List<Book> list1 = q.list();
- List<Book> list2 = q.list();
- session.close();
同一个query。list了两次,按照之前的效果,应该是执行一个sql。事实是,他要去查两次,
在一个query尚且如此,两个不用说,肯定也是没有用到缓存了。
难道缓存失效了?呵呵,其实是因为我们虽然配置了缓存,但是在query级却没有设置缓存,如果需要query缓存,
则需要手工写入:
q.setCacheable(true);来激活查询缓存。
修改代码如下:
- public void listBookTwice(){
- String hql = "from Book" ;
- Session session = HibernateSessionFactory.getSession();
- Query q = session.createQuery(hql);
- q.setCacheable(true );
- List<Book> list1 = q.list();
- for (Book b : list1){
- System.out.println(b.getBname()+"--------->list1" );
- }
- // List<Book> list2 = q.list();
- session.close();
- Session session2 = HibernateSessionFactory.getSession();
- Query q2 = session2.createQuery(hql);
- q2.setCacheable(true );
- List<Book> list2 = q2.list();
- for (Book b : list2){
- System.out.println(b.getBname()+"--------->list2" );
- }
- session2.close();
- }
在两个session立分别list查询,ok,只输出一条sql。说明二级缓存在list查询的时候也起作用了。
那hibernate是根据什么来缓存list呢,参考:
http://www.javaeye.com/topic/18904
对于查询缓存来说,缓存的key是根据hql生成的sql,再加上参数,分页等信息(可以通过日志输出看到,不过它的输出不是很可读,最好改一下它的代码)。
比如hql:
from Cat c where c.name like ?
生成大致如下的sql:
select * from cat c where c.name like ?
参数是"tiger%",那么查询缓存的key*大约*是这样的字符串(我是凭记忆写的,并不精确,不过看了也该明白了):
select * from cat c where c.name like ? , parameter:tiger%
这样,保证了同样的查询、同样的参数等条件下具有一样的key。
现在说说缓存的value,如果是list方式的话,value在这里并不是整个结果集,而是查询出来的这一串ID。
也就是说,不管是list方法还是iterate方法,第一次查询的时候,它们的查询方式很它们平时的方式是一样的,
list执行一条sql,iterate执行1+N条,多出来的行为是它们填充了缓存。但是到同样条件第二次查询的时候,就都和iterate的行为一样了,
根据缓存的key去缓存里面查到了value,value是一串id,然后在到class的缓存里面去一个一个的load出来。这样做是为了节约内存。
可以看出来,查询缓存需要打开相关类的class缓存。list和iterate方法第一次执行的时候,都是既填充查询缓存又填充class缓存的。
这里还有一个很容易被忽视的重要问题,即打开查询缓存以后,即使是list方法也可能遇到1+N的问题!相同条件第一次list的时候,
因为查询缓存中找不到,不管class缓存是否存在数据,总是发送一条sql语句到数据库获取全部数据,然后填充查询缓存和class缓存。
但是第二次执行的时候,问题就来了,如果你的class缓存的超时时间比较短,现在class缓存都超时了,但是查询缓存还在,
那么list方法在获取id串以后,将会一个一个去数据库load!因此,class缓存的超时时间一定不能短于查询缓存设置的超时时间
!如果还设置了发呆时间的话,保证class缓存的发呆时间也大于查询的缓存的生存时间。这里还有其他情况,比如class缓存被程序强制evict了,
这种情况就请自己注意了。
另外,如果hql查询包含select字句,那么查询缓存里面的value就是整个结果集了。
可以理解为hibernate缓存了每次查询的hql语句作为缓存map的key,将对应对象的id作为value缓存,每次遇到相同的hql,就将id取出来,
如果在缓存里面有对象,就从缓存取,没有的话就去数据库load
缓存什么时候更新呢?
看代码:
- public void update(){
- Session session = HibernateSessionFactory.getSession();
- Transaction tran = session.beginTransaction();
- tran.begin();
- Book b = (Book) session.get(Book.class , 7 );
- b.setIsbn("567890" );
- session.saveOrUpdate(b);
- tran.commit();
- session.close();
- }
- public void listBookTwice(){
- String hql = "from Book" ;
- Session session = HibernateSessionFactory.getSession();
- Query q = session.createQuery(hql);
- q.setCacheable(true );
- List<Book> list1 = q.list();
- for (Book b : list1){
- System.out.println(b.getBname()+"----" +b.getIsbn()+"--------->list1" );
- }
- session.close();
- }
- public void listBookAgain(){
- String hql = "from Book" ;
- Session session2 = HibernateSessionFactory.getSession();
- Query q2 = session2.createQuery(hql);
- q2.setCacheable(true );
- List<Book> list2 = q2.list();
- for (Book b : list2){
- System.out.println(b.getBname()+"----" +b.getIsbn()+"--------->list3" );
- }
- session2.close();
- }
- public static void main(String[] args) {
- BookDao dao = new BookDao();
- dao.listBookTwice();
- dao.update();
- dao.listBookAgain();
- }
先list一次,之间更新一个book,第二次list,输出:
- Hibernate: select book0_.id as id0_, book0_.bname as bname0_, book0_.isbn as isbn0_, book0_.price as price0_ from hibernate_test.dbo.book book0_
- book1250672666171----123456 --------->list1
- book1250672666203----123456 --------->list1
- book1250672666203----123456 --------->list1
- book1250672666203----123456 --------->list1
- book1250672666203----123456 --------->list1
- Hibernate: update hibernate_test.dbo.book set bname=?, isbn=?, price=? where id=?
- Hibernate: select book0_.id as id0_, book0_.bname as bname0_, book0_.isbn as isbn0_, book0_.price as price0_ from hibernate_test.dbo.book book0_
- book1250672666171----123456 --------->list3
- book1250672666203----567890 --------->list3
- book1250672666203----123456 --------->list3
- book1250672666203----123456 --------->list3
- book1250672666203----123456 --------->list3
可见,当数据库有更新的时候,缓存就失效了。
java进阶
http://www.javady.com/index.php/category/hign_xingneng
转载
发表评论
-
java转换音频视频
2014-01-08 15:10 2372感谢:http://tj007-bo.iteye.com/b ... -
jconsole监控tomcat
2013-12-12 12:32 1178Server端对tomcat启动脚本配置如下参数: 编辑${ ... -
StringUtils详细介绍
2013-04-12 16:49 1391StringUtils详细介绍 ... -
javamail的smtp方式发送邮件实例
2013-01-17 10:41 2694本实例为javamail发送smtp邮件实例和常见问题解决 ... -
压缩 HDFS 上的文件, 提供使用者下載
2012-09-06 13:48 1736(转)今天的進度是研究如何讓使用者透過網路來下載 HDF ... -
svn常见错误及解决办法
2012-09-04 12:49 37329这里有自己收集整理的关于SVN的东西,1——SVN基本使用手册 ... -
hbase常见错误及解决方法
2012-08-16 14:59 23221. 运行hbase shell 时错误:ERROR: org ... -
Hive metastore三种存储方式
2012-08-15 14:42 24722测试环境下Hive总出问题,metastore的配置有问题。抽 ... -
hive 安装运行错误及解决办法
2012-08-15 14:33 16181.hive> show tables;FAILED: ... -
Apache下403 Forbidden错误
2012-07-28 16:00 2047安装phpstudy2.0,安装完毕后可以访问测试的页面,重启 ... -
jbpm4常见 错误及解决方法
2012-07-26 11:13 17841. 结束实例错误 Configuration co ... -
Hibernate中cascade和inverse区别
2012-07-19 15:48 1611Hibernate中的inverse在表关 ... -
汉字和拼音转换工具
2012-07-18 10:36 1366两个Java版中文转汉语拼音工具 1. CnToS ... -
Yale CAS实践
2012-06-29 12:19 1836Yale CAS最佳实践 第一部分:配置篇 1. ... -
六种方式实现hibernate查询
2012-06-15 12:00 1025hibernate查询的6种方法。分别是HQL查询 ,对象化 ... -
Hibernate Tools 的使用
2012-06-08 12:05 1399Hibernate Tools 的使用 由于myEclip ... -
编程不懂正则表达式,不如回家种红薯
2012-05-25 16:56 1253编程的大量工作都是在处理字符串,如验证输入、查找子串替换、解 ... -
学习Spring框架的技术内幕
2012-04-27 14:06 1275引述要学习Spring框架的技术内幕,必须事先掌握一些基本的J ... -
Java图片识别技术原理
2012-04-11 20:50 1690import java.awt.image.BufferedI ... -
JDK里的设计模式
2012-04-09 11:19 1005JDK里的设计模式 ...
相关推荐
本文将深入探讨Hibernate的一级缓存、二级缓存以及查询缓存,通过具体的实例来阐述它们的工作原理和使用方法。 首先,我们从一级缓存开始。一级缓存是Hibernate默认提供的缓存,它是每个Session级别的,也被称为...
**hibernate一级缓存、二级缓存和查询缓存** 在Java的持久化框架Hibernate中,缓存机制是提高应用程序性能的关键要素。缓存能够减少数据库的访问次数,提高数据读取速度,并且在一定程度上降低了系统的负载。本文将...
总结来说,Hibernate的二级缓存和查询缓存是提升性能的重要手段,但正确配置和使用它们至关重要,以免带来不必要的性能损失。通过合理的缓存策略和配置,可以有效地减少数据库交互,提升应用的响应速度。
一级缓存是 Hibernate 内置的,默认开启,与 Session 对象关联。它是一个事务范围的缓存,也就是说,每个 Hibernate Session 对应一个一级缓存,仅在当前事务中有效。一级缓存主要存储了 Session 在当前事务中加载和...
Hibernate 二级缓存是针对SessionFactory级别的全局缓存,与一级缓存(Session级别)不同,一级缓存只在单个Session生命周期内有效。二级缓存则允许不同Session之间共享数据,提高了数据访问效率,减少了对数据库的...
在源码实例中,你可以看到如何在代码层面与二级缓存进行交互,例如通过SessionFactory的getCache()方法来读取或插入数据。同时,注意在多线程环境下,合理控制并发访问,防止数据一致性问题。 二级缓存虽然能提高...
描述中提到的链接可能是对Hibernate缓存机制的详细技术博客,但具体内容未给出。因此,我们将基于常规的Hibernate缓存知识进行解释。 **一、Hibernate一级缓存** 一级缓存是每个Hibernate Session内的缓存,它是一...
当数据从数据库中加载时,Hibernate会尝试将这些对象放入二级缓存,后续的相同查询就可以直接从缓存中获取结果,避免了额外的数据库查询。这有助于提高性能,尤其是在处理重复查询时。 配置和选择二级缓存实现是...
二级缓存通常由第三方插件如Ehcache、Infinispan等提供,这些插件实现了JCache(JSR-107)标准,与Hibernate无缝集成。 ### 3. 二级缓存配置 在Hibernate配置文件(hibernate.cfg.xml)中,我们需要添加二级缓存...
以下是关于Hibernate二级缓存与Ehcache的详细知识点: 1. **二级缓存的作用**:一级缓存是每个Session内部的缓存,用于存储Session内的对象,而二级缓存则是一个全局范围的缓存,它可以在多个Session之间共享,减少...
2. **缓存与数据库的同步**:当我们调用`Session.flush()`方法时,Hibernate会将一级缓存中所有更改过的对象同步到数据库,确保数据的一致性。而在事务提交(`Transaction.commit()`)时,Hibernate会自动执行flush...
1. **一级缓存与二级缓存的区别**: - 一级缓存:每个 Hibernate Session 对象都有一个一级缓存,它是默认开启的。当对象被加载到 Session 中,它们会被存储在一级缓存中,直到 Session 被关闭。一级缓存是事务范围...
Hibernate 二级缓存
### 一、一级缓存与二级缓存 1. **一级缓存(First-Level Cache)**:每个Session实例都有一个私有的、线程安全的一级缓存,它是默认开启且不可关闭的。当我们在Session中对实体进行CRUD操作时,数据会首先被缓存到...
本篇文章将深入探讨Hibernate的二级缓存机制,以及如何进行一级缓存与二级缓存的同步,同时还会介绍二级缓存的配置文件设置。 一级缓存是Hibernate默认提供的缓存,每个SessionFactory实例都有一个一级缓存。当对象...
在深入探讨Hibernate查询缓存之前,我们先了解一下Hibernate的基础概念。Hibernate是一个强大的Java持久化框架,它简化了数据库操作,提供了对象关系映射(ORM)功能。在Hibernate中,对象的状态分为瞬时态、持久态...
一级缓存的生命周期与Session相同,当Session关闭时,一级缓存中的数据也会被清除。 二级缓存则是SessionFactory级别的缓存,它可以跨Session共享数据,提供全局性的缓存服务。它分为进程内缓存(如EHCache)和...