1.
Session
缓存:
1
)
.
在
Session
接口的实现中包括一系列的
Java
集合
,
这些
Java
集合构成了
Session
缓存
.
它用于存放
Session
关联的对象(
Session
关联对象的方式有非常多种。
比如:
session.get
(
Class
,
OID
)
、
session.update
()
、
session.save
()
...
)。
仅仅要
Session
实例没有结束生命周期
,
且没有清理缓存。则存放在它缓存中的对象也不会结束生命周期。
Session
缓存可降低 Hibernate
应用程序訪问数据库的频率。
2
)
.
操作
Session
缓存的方法(了解一下吧)。
①
.
若调用
session.get
()
从数据库中载入一个对象。则该对象会被纳入到
Session
缓存中。
News news
=
(
News
)
session.get
(
News.class
,
1
);
//
会向数据库发送
SQL
吗
?
不会发送
SQL
语句
,
而是从
Session
缓存获取对象的引用(快照)
News news2
=
(
News
)
session.get
(
News.class
,
1
);
②
. Session
的
clear
()
方法能够清空
Session
的缓存
News news
=
(
News
)
session.get
(
News.class
,
1
);
//
清理
session
缓存
session.clear
();
//
会向数据库发送
SQL
吗
?
会
!
由于
Session
缓存被清空了
!
News news2
=
(
News
)
session.get
(
News.class
,
1
);
③
. Session
的 flush()
方法:
清理缓存
-
强制使数据库记录和
Session
缓存中对象状态保持一致,可能会发送
SQL
语句
(若数据库记录和
Session
中对象状态不一致。则发送
SQL
。否则不发送
SQL
)
I.
默认情况下,提交事务时,会先清理缓存。然后再提交事务
II.
若主键生成方式使用的是数据库底层的自增长方式。会在运行
Session
的
save
()
方法时,就清理缓存,运行
INSERT
语句。
而不是等到提交事务时。
Hibernate
要求和
Session
关联的对象必须有和数据表记录相应的
OID
,这就意味着运行
save
()
方法后。
必须有
OID
,而底层自增长的方式生成主键,必须先运行
INSERT
才干获取主键值
//
若使用
MySQL
底层自增的方式生成主键,
save
()
方法即会引起发送
INSERT
语句
session.save
(
news
);
System.out.println
(
news.getId
());
III.
使用
HQL
(
Hibernate Query Language
)查询记录时,不经过
Session
缓存!直接查询数据库,且要求查询的结果是最新的。
所以,在进行
HQL
查询之前须要先清理缓存
session.save
(
news
);
//
会导致清理缓存
News news2
=
(
News
)
session.createQuery
(
"FROM News n WHERE n.id = ?"
)
.
setInteger
(
0
,
news.getId
()).
uniqueResult
();
IV. commit
() 和 flush()
方法的差别:
flush
运行一系列
sql
语句,但不提交事务;
commit
方法先调用
flush
()
方法,然后提交事务
.
意味着提交事务对数据库的操作永久保存下来。
④
. refresh
() 方法:
强制使
Session
缓存中的对象的状态和数据库记录保持一致。
所以会强制发送一条
SELECT 语句。
注意,由于
MySQL
的默认的隔离级别为
READ REPTABLE
。所以须要设置事务的隔离级别才干看到实验的效果
<
!
--
设置
Hibernate
的事务的隔离级别
,
设置为读已提交
-->
<property name ="connection.isolation" >2 </property >