三种状态:
瞬时状态、持久化态、游离态
瞬时状态:刚new出来的一个对象 new delelte //垃圾回收持久化态:已经保存到数据库中 save update
游离态:数据库中有,但是session里面没有 clear evict close //垃圾回收
load、get将数据库中的游离态转换为持久化态 再添加数据并且commit 生成两条sql语句
乐观锁:
当多个用户并发操作一个对象的时候同时读取一个版本号,第一个用户操作完成后版本号加一。另外的用户操作的还是之前的那个版本号所以不会对这些用户得操作进行修改。
相对于悲观锁来讲,悲观锁更多的是数据库来管理锁,而乐观锁基于数据版本记录机制实现。
在持久化类加入版本号属性VERSION
在getVERSION上方加入注解@Version就能实现乐观锁
缓存:
目的:减少应用程序对物理数据库源访问的频次,提高应用程序的运行性能
一级缓存:session缓存
二级缓存:SessionFactory(需要配置相关的信息)
怎么的数据适合放在二级缓存中:
1、很少被修改的数据
2、不会被并发访问的数据
3、常量数据
不适合存放的二级缓存的数据?
1、经常被修改的数据
2、绝对不允许出现并发的数据
3、与其他应用共享的数据
当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查
查不到,如果配置了二级缓存,那么从二级缓存中查
如果都查不到再查询数据库,把结果按照id放入到缓存删除、更新、增加数据额度时候同时更新缓存
应用场景1:当从数据库中查找一条数据后再提交事务,再创建一个对象用同样的条件查找数据,返回的结果是两个对象完全相同,并且只执行了一条sql语句。
二级缓存的管理:
SessionFactory.evict(Banji.class,1)
SessionFactory.evictCollection("Banji.students")
如何配置二级缓存?
新增ehcache.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="10"
timeToLiveSeconds="10"
overflowToDisk="true"
/>
</ehcache>
再在hibernate.cfg.xml配置文件中加入二级缓存的属性配置
ehcache-core-2.4.6.jar
hibernate-ehacache-4.0.0.CR6.jar
<!-- 开启二级缓存 -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<!-- 启动"查询缓存"如果想缓存使用findall()、list()、Iterator()、createCriteria()、createQuery()等方法获得的数据结果集,必须配置此项-->
<property name="hibernate.cache.use_query_cache">true</property>
<!-- 设置二级缓存插件EHCache的Provider类-->
<!-- <property name="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
</property> -->
<!-- 二级缓存区域名的前缀 -->
<!--<property name="hibernate.cache.region_prefix">test</property>-->
<!-- 高速缓存提供程序 -->
<property name="hibernate.cache.region.factory_class">
org.hibernate.cache.ehcache.EhCacheRegionFactory
</property>
<!-- Hibernate4以后都封装到org.hibernate.cache.ehcache.EhCacheRegionFactory -->
<!-- 指定缓存配置文件位置 -->
<!-- <property name="hibernate.cache.provider_configuration_file_resource_path">
ehcache.xml
</property> -->
<!-- 强制Hibernate以更人性化的格式将数据存入二级缓存 -->
<property name="hibernate.cache.use_structured_entries">true</property>
<!-- Hibernate将收集有助于性能调节的统计数据 -->
<property name="hibernate.generate_statistics">true</property>
持久化类写上注解
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
连接池
hibernate4需要导入的包c3p0-0.9.1.jar hibernate-c3p0-4.1.2.final.jar
<!--连接池 -->
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="proxool.pool_alias">myds</property>
<property name="proxool.xml">proxool.xml</property>
<property name="hibernate.c3p0.max_size">10</property>
<property name="hibernate.c3p0.min_size">1</property>
<property name="hibernate.c3p0.max_statements">3</property>
<property name="hibernate.c3p0.timeout">30</property>
<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.c3p0.idle_test_periodt">10</property>
proxool.xml配置文件中也是存放的连接数据库的信息
初始化100个连接,当一个用户来访问服务器的时候就给一个连接,当100个连接全部被用后,剩下的用户只能等待连接被释放。