码迷,mamicode.com
首页 > Web开发 > 详细

Hibernate Session缓存

时间:2017-11-04 18:14:09      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:closed   let   设置   提交   invalid   清理缓存   protect   nec   tar   

Session缓存:

  在 Session 接口的实现中包含一系列的 Java 集合, 这些 Java 集合构成了 Session 缓存. 只要 Session 实例没有结束生命周期, 且没有清理缓存,则存放在它缓存中的对象也不会结束生命周期
  Session 缓存可减少 Hibernate 应用程序访问数据库的频率。

1:利用反射查询对象

News news =(News) session.get(News.class, 1);
        System.out.println(news);
        News news2 =(News) session.get(News.class, 1);
        System.out.println(news2);

但是只出现了一条SQL

技术分享

这就是session缓存。也叫一级缓存。位于缓存中的数据叫做持久化对象。

站在持久化的角度。hibernate把对象分为4种状态:持久化。临时。游离。删除。

session缓存有三个方法。

技术分享

1:flush()方法。

    它的作用:缓存中的数据对象与数据库中数据对象保持一致。会发送SQL语句。但是不会提交事务。

    为了确保数据一致。在以下会调用flush()方法。

      1:显示的调用。session.flush();

      2:事务提交的时候。会先调用flush()。然后再提交事务。

      3:执行HQL或QBC查询。

      4:若记录的ID是native(底层数据库自增的形式)生成的。在调用save()方法后。立即发送insert语句。

     commit()方法的源码:在AbstractTransaction类中。

 1 @Override
 2     public void commit() throws HibernateException {
 3         if ( localStatus != LocalStatus.ACTIVE ) {
 4             throw new TransactionException( "Transaction not successfully started" );
 5         }
 6 
 7         LOG.debug( "committing" );
 8 
 9         beforeTransactionCommit();
10 
11         try {
12             doCommit();
13             localStatus = LocalStatus.COMMITTED;
14             afterTransactionCompletion( Status.STATUS_COMMITTED );
15         }
16         catch ( Exception e ) {
17             localStatus = LocalStatus.FAILED_COMMIT;
18             afterTransactionCompletion( Status.STATUS_UNKNOWN );
19             throw new TransactionException( "commit failed", e );
20         }
21         finally {
22             invalidate();
23             afterAfterCompletion();
24         }
25     }

在12行提交事务。第9行是  beforeTransactionCommit();

在提交事务前干点什么?

在JdbcTransaction类中。

 

 1 protected void beforeTransactionCommit() {
 2         transactionCoordinator().sendBeforeTransactionCompletionNotifications( this );
 3 
 4         // basically, if we are the driver of the transaction perform a managed flush prior to
 5         // physically committing the transaction
 6         if ( isDriver && !transactionCoordinator().getTransactionContext().isFlushModeNever() ) {
 7             // if an exception occurs during flush, user must call rollback()
 8             transactionCoordinator().getTransactionContext().managedFlush();
 9         }
10 
11         if ( isDriver ) {
12             transactionCoordinator().getTransactionContext().beforeTransactionCompletion( this );
13         }
14     }

 

在第8行会管理事务。TransactionContext  类中

public void managedFlush();
SessionImpl  类中
1
public void managedFlush() { 2 if ( isClosed() ) { 3 LOG.trace( "Skipping auto-flush due to session closed" ); 4 return; 5 } 6 LOG.trace( "Automatically flushing session" ); 7 flush(); 8 }

在第7行进行flush()方法的调用。

2:refresh():强制使缓存中的一个对象状态与数据库中记录的对象状态一致。

技术分享

 

 

 打上断点。然后现在去数据库中修改数据。

技术分享

得到的数据还是一样的。

 技术分享

使用refresh()方法

技术分享

 

 技术分享

 

 这是因为Hibernate在MySQL中的隔离级别。默认是可重复读。虽然重新读了一个select。但是还是读的以前的那个select语句。

技术分享

技术分享

在hibernate.cfg.xml中

1 <!-- 设置隔离级别 -->
2         <property name="connection.isolation">2</property>

1. READ UNCOMMITED  读未提交数据
2. READ COMMITED    读已提交数据
4. REPEATABLE READ  可重复读
8. SERIALIZEABLE    串行化

3:clear()  清理缓存

 

Hibernate Session缓存

标签:closed   let   设置   提交   invalid   清理缓存   protect   nec   tar   

原文地址:http://www.cnblogs.com/bulrush/p/7783674.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!