技术中心

这里象征着我们的态度和能力

>Hibernate性能优化策略
发布者:中国IT实验室    信息来源:中国IT实验室    发布时间:2012-01-09      浏览次数:6232
分享到:

新浪微博

腾讯微博

QQ空间

豆瓣网

QQ好友

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

  使用乐观锁在表中加一个version的字段来解决并发性问题

  悲观锁:就是多个人同时想修改某个数据,

  第一个人读出数据,数据库就锁定了其他人对该数据的修改和删除,

  但允许其它人查询该数据,直到第一个人提交保存后其它人才能修改,

  否则其它人在提交时系统会一直等待第一个人完成提交

  乐观锁:乐观锁需要在表中加一version(版本)字段,并要在对应的类中配置

  就是多个人同时想修改某个数据,如果多人同时读出数据,那么他们的版本号都相同比如是1,

  然后其中有一个人最先提交了修改,那么表中版本字段会自动加一,

  当其它人提交时hibernat会自动判断自己的版本号是否与数据库中的版本号相同,

  如果低于数据库中的版本号那么就不允许提交。

  (如果是使用jdbc开发那么用户也要自己写个判断代码进行对版本号的判断)

  采用hibernate_session代码测试

  一级缓存(用hibernate_one-to-many代码测试

  1、一级缓存很短,和session的生命周期一致,随着session的关闭而消失

  *load/get/iterate(查询实体对象)可以使用缓存数据

  2、一级缓存它缓存的是实体对象

  3、如果管理缓存,如session.clear()/session.evict()

  4、如何避免一次性大批量实体数据插入内存溢出的问题?

  *先执行flush,在用clear清除缓存

  //发出两次load()第一次发一条sql第二次不发,说明它是先在一级缓存找数据,如果没有再到数据库找。

  /**

  * 发出两次load查询

  *

  */

  Student student = (Student)session.load(Student.class, 1);

  System.out.println("学生姓名:" + student.getName());

  //因为有一级缓存,load方法使用一级缓存,所以本次查询不再发出sql

  student = (Student)session.load(Student.class, 1);

  System.out.println("学生姓名:" + student.getName());

  -------------------------------------------------------------------------------------------

  //发出两次get() 同上

  /**

  * 发出两次get查询

  *

  */

  Student student = (Student)session.get(Student.class, 1);

  System.out.println("学生姓名:" + student.getName());

  //因为有一级缓存,get方法使用一级缓存,所以本次查询不再发出sql

  student = (Student)session.get(Student.class, 1);

  System.out.println("学生姓名:" + student.getName());

  --------------------------------------------------------------------------------------------

  /**

  * 发出两次iterate查询实体对象

  *

  */

  public void testCache3() {

  Session session = null;

  try {

  session = HibernateUtils.getSession();

  Student student = (Student)session.createQuery("from Student where id=1").iterate().next();

  System.out.println("学生姓名:" + student.getName());

  //因为有一级缓存,iterate方法使用一级缓存,发出查询id的sql,不再发出查询实体对象的sql

  student = (Student)session.createQuery("from Student where id=1").iterate().next();

  System.out.println("学生姓名:" + student.getName());

  //发出两次iterate查询实体对象

  (iterate 会有n+1问题,如果缓存有发查id那1条)

  先从数据库查出所有id,再根据ID查数据,所以会有n+1问题,但查实体对象会先在一级缓存查找

[1] [2] [3] [4] 下一页

4000-880-989
(24小时热线)
联系客服
微信公众号

官方公众号

小程序

©2008-2022 CORPORATION ALL Rights Reserved. 昆明奥远科技有限公司版权所有 滇ICP备09003328号-1 滇公网安备 53011102000818号
昆明那家网络公司好,新媒体运营,网站优化,网络推广,网站建设,网页设计,网站设计,网站推广,云南网站公司,昆明新媒体公司,云南网红主播,昆明SEO公司,昆明网站建设,昆明网络推广,昆明网站优化,昆明网站推广,红河网站建设,大理网络公司,曲靖网络公司,丽江网站设计,昭通网络公司,保山大数据服务,智慧高速建设,智慧校园服务,云南IDC服务商,网络安全测评,等保测评,网站关键词排名优化服务,服务客户尽超2000余家,一切尽在奥远科技,服务电话:13888956730