职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 663|回复: 3

web应用程序为提高性能查询时更改database isolation level

[复制链接]
已经来了吗 发表于 2011-8-7 10:31 | 显示全部楼层 |阅读模式
目前所做的项目中UAT阶段遇到一个BUG, BUG 描述为 Login takes up to 24 seconds on OPA when also importing allocation plan lines
fix solution is: Set trsanction isolation level to read uncommitted for the get allocation plan lines queries (including row count)


具体代码:
  1. // Set the current session to have isolation read uncommitted.   
  2. // Returns the previous isolation level before the read uncommitted was set.   
  3. protected int setTransactionReadUncommited() {   
  4. int currentTransactionLevel = -1;   
  5. try {   
  6. currentTransactionLevel = getSession().connection().getTransactionIsolation();   
  7. getSession().connection().setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);   
  8. }   
  9. catch (HibernateException e)   
  10. { e.printStackTrace(); }   
  11. catch (SQLException e)   
  12. { e.printStackTrace();   
  13. }   
  14. return currentTransactionLevel;   
  15. }   

  16. // Set the current session to have isolation read uncommitted.
  17. // Returns the previous isolation level before the read uncommitted was set.
  18. protected int setTransactionReadUncommited() {
  19. int currentTransactionLevel = -1;
  20. try {
  21. currentTransactionLevel = getSession().connection().getTransactionIsolation();
  22. getSession().connection().setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
  23. }
  24. catch (HibernateException e)
  25. { e.printStackTrace(); }
  26. catch (SQLException e)
  27. { e.printStackTrace();
  28. }
  29. return currentTransactionLevel;
  30. }   
复制代码
调用部分:
  1. public Object findByScheduleRequestID(Long requestID, Integer startIndex, Integer pageSize)   
  2. {   
  3. Criteria criteria = getSession().createCriteria(Delivery.class);   
  4. Criteria srCriteria = criteria.createCriteria("scheduleRequest", Criteria.FULL_JOIN);   
  5. srCriteria.add(Restrictions.eq("id", requestID));   
  6. criteria.addOrder(Order.asc("id"));   
  7. criteria.setFirstResult(startIndex.intValue());   
  8. criteria.setMaxResults(pageSize.intValue());   
  9. int previousTransactionLevel = setTransactionReadUncommited(); List result = criteria.list();   
  10. setTransactionBack(previousTransactionLevel);   
  11. return result;   
  12. }  

  13. public Object findByScheduleRequestID(Long requestID, Integer startIndex, Integer pageSize)
  14. {
  15. Criteria criteria = getSession().createCriteria(Delivery.class);
  16. Criteria srCriteria = criteria.createCriteria("scheduleRequest", Criteria.FULL_JOIN);
  17. srCriteria.add(Restrictions.eq("id", requestID));
  18. criteria.addOrder(Order.asc("id"));
  19. criteria.setFirstResult(startIndex.intValue());
  20. criteria.setMaxResults(pageSize.intValue());
  21. int previousTransactionLevel = setTransactionReadUncommited(); List result = criteria.list();
  22. setTransactionBack(previousTransactionLevel);
  23. return result;
  24. }
复制代码
事务管理为编程型事务(JTA)方式用struts2的拦截器去拦截方式实现:
代码:
  1. public class TransactionClosingInterceptor extends AbstractInterceptor   
  2. {   
  3. Logger log = Logger.getLogger(this.getClass());   
  4. @Override public String intercept(ActionInvocation invocation) throws Exception {   
  5. UserTransaction tx = null;   
  6. try { String result ="";   
  7. try{ result = invocation.invoke();   
  8. }   
  9. catch (Exception e)   
  10. { e.printStackTrace(); throw e; }   
  11. tx = (UserTransaction)new InitialContext().lookup("java:comp/UserTransaction");   
  12. tx.commit(); return result; }   
  13. catch(Exception e) { e.printStackTrace(); if (tx !=null)   
  14. { tx.rollback(); } invocation.getInvocationContext().getSession().clear();   
  15. invocation.getInvocationContext().getSession().clear(); return "error_ns"; */ } } }   
  16.   
  17.   
  18. public class TransactionOpeningInterceptor extends AbstractInterceptor {   
  19. Logger log = Logger.getLogger(this.getClass());   
  20. @Override public String intercept(ActionInvocation invocation) throws Exception { UserTransaction tx = null;   
  21. try { tx = (UserTransaction)new InitialContext().lookup("java:comp/UserTransaction");   
  22. tx.setTransactionTimeout(300); tx.begin();   
  23. return invocation.invoke(); } catch(Exception e)   
  24. { if (tx !=null){ tx.rollback(); }   
  25. return Action.ERROR; } } }  

  26. public class TransactionClosingInterceptor extends AbstractInterceptor
  27. {
  28. Logger log = Logger.getLogger(this.getClass());
  29. @Override public String intercept(ActionInvocation invocation) throws Exception {
  30. UserTransaction tx = null;
  31. try { String result ="";
  32. try{ result = invocation.invoke();
  33. }
  34. catch (Exception e)
  35. { e.printStackTrace(); throw e; }
  36. tx = (UserTransaction)new InitialContext().lookup("java:comp/UserTransaction");
  37. tx.commit(); return result; }
  38. catch(Exception e) { e.printStackTrace(); if (tx !=null)
  39. { tx.rollback(); } invocation.getInvocationContext().getSession().clear();
  40. invocation.getInvocationContext().getSession().clear(); return "error_ns"; */ } } }


  41. public class TransactionOpeningInterceptor extends AbstractInterceptor {
  42. Logger log = Logger.getLogger(this.getClass());
  43. @Override public String intercept(ActionInvocation invocation) throws Exception { UserTransaction tx = null;
  44. try { tx = (UserTransaction)new InitialContext().lookup("java:comp/UserTransaction");
  45. tx.setTransactionTimeout(300); tx.begin();
  46. return invocation.invoke(); } catch(Exception e)
  47. { if (tx !=null){ tx.rollback(); }
  48. return Action.ERROR; } } }
复制代码
系统当中有六七个DAO用这种方式,担是如果用这种事务隔离级别(允许读取另外事务没有提交的数据)可能出现脏读的现像虽然查询完后有改回以前的事务隔离级别。这种处理方式真的没有不会带来业务
上的问题吗?欢迎各们同仁讨论!另外等我老大回来了我会和他讨论为什么采取这种方式,看和大家分析的是不是一致,(现在人家是vacation month)haha.




会玩就好 发表于 2011-8-7 10:31 | 显示全部楼层
推荐推荐推荐推荐
会玩就好 发表于 2011-8-11 14:56 | 显示全部楼层
我的我的 忘记了 呵呵
ksdal 发表于 2011-8-16 10:25 | 显示全部楼层
哈哈!!!!
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-4-30 14:15 , Processed in 0.144401 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表