hibernate中数据库的优化

三、list和iterate不一样算法

a)list取全部数据库

b)literate先取ID,等到用的时候根据ID取对象缓存

c)session中list第二次发出,仍会到数据库查询。session

d)iterate第二次,先找session级缓存。并发

四、一级缓存和二级缓存和查询缓存spa

a)什么是缓存hibernate

能够在内存中开辟一块空间,把原本在数据库中读的东西 放在内存中,这样读的时候直接从内存中读取。xml

b)一级缓存对象

session级别的缓存。一个session不能取另外一个session的内容。事务

c)二级缓存

sessionFactory级别的缓存

弄一个大的缓存,把全部的session所有放在里面

适合场景:

常常被访问,改动不大,数量有限。好比用户的权限,组织机构。

用法:在须要接入缓存的类的上面加@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)//表示既能读也能改

loadt默认使用二级缓存,iterate默认使用二级缓存

d)查询缓存

list默认使用二级缓存加数据,可是查询的时候不用,也就是说,在内存中有对象,可是会去从数据库中查询。

缘由是每次执行query查询的时候可能语句不同,或许查询的数据部分不在缓存中。若是第一次查的语句和第二次

查的同样,会去内存中查,这就是查询缓存。

使用方法:

i.在配置hibernate.cfg.xml中加入

<property name = "cache.use_query_cache">true</property> 

固然缓存的配置中必须开启缓存。

ii.session.createQuery("").setChacheable(true).list();

iii.若是使用两次session,不会发出两条查询语句,则证实查询缓存开启。

e)缓存算法

内存里的对象一旦满了,新来的对象会把哪一个对象替换掉?

LRU,LFU,FIFO

LRU:Least Recently Used,最近不多被使用。

LFU:Least Frequently Used ,最近使用频度最低替换, 好比说最近访问100次,哪一个命中率最低,哪一个被替换掉。

FIFO:First In First Out ,谁先进来谁先出去。

设置:

ehcache.xml中在<cache>标签中设置memoryStoreEvictionPolicy=”LRU“

五、事务的并发处理

a)什么是事务?

要么都完成,要么都不完成。

b)常见特性:具备ACID特性

i.原子性

ii.一致性

iii.独立性

iv.持久性

c)事务并发可能出现的问题

i.第一类丢失更新(数据库只要支持事物,这个问题就能够解决)

ii.脏读(*)

读了别的事务没有提交的数据

iii.不可重复读(*)(用在更新操做)

同一个事物先后读的数据不同,被另外一个事务影响了。

iv.第二类丢失更新(不可重复读的特殊状况)

v.幻读(插入和删除的操做)(*)

同一个事务先后读的数据不同,被另外一个事务影响了,在读的过程当中,

另一个事务可能插入一条新的纪录。

d)解决方案

i.让它不要并发

数据库的事务隔离机制

MySQL中查询事务机制:select @@tx_isolation.

serial解决一切问题,可是不设这个级别,当检查问题时才会使用。

咱们通常使用的是read-committed,避免脏读,并发性也比较好,经过其余手段

设定hibernate的事务隔离级别

hibernate.connection.isolation=2

可是这样作仍是会出现不可重复读,幻读的问题

ii.在hibernate中使用悲观锁解决repeatable read 的问题(依赖于数据库的锁)

通常状况下查询总数,不会在一个session中查询,因此暂时不用解决幻读的问题,

实际应用中不太用到悲观锁。

iii.在load第三个参数中加LockMode.UPGRADE

iv.悲观锁是为了防止别人修改,直接加把锁,乐观锁是设置字段,先后进行对比,查看

是否一致,若是一致,则证实没有被改过,若是不一致,则进行响应的处理。

v.乐观锁的实现

增长@version注解,若是有人更新,则会报错,而后根据须要作出相应的解决。

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息