资讯专栏INFORMATION COLUMN

记一次线上bug处理-mybatis一级缓存引起

sean / 1295人阅读

摘要:问题线上定时任务计算出的金额不对定位问题查看日志好像也执行了但是金额为什么和数据库的表里的不一致再查整个的定时任务日志日切日期

问题:

线上riskProvision定时任务,计算出的金额不对

定位问题:

查看日志

</>复制代码

  1. 4.13 riskProvision
  2. 2017-04-13 01:10:00.009 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [com.tangdi.jump.bp.service.sqlmap.support.SqlSessionUtils] DEBUG Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@12af9e28] from current transaction
  3. 2017-04-13 01:10:00.010 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [com.tangdi.jump.bp.service.sqlmap.impl.SqlMapImpl] DEBUG Opened SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@12af9e28] for iBATIS operation
  4. 2017-04-13 01:10:00.010 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [com.tangdi.jump.bp.service.sqlmap.support.SqlSessionUtils] DEBUG Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@12af9e28]
  5. 2017-04-13 01:10:00.011 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [com.tangdi.jump.bp.service.sqlmap.support.SqlSessionUtils] DEBUG Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@12af9e28] from current transaction
  6. 2017-04-13 01:10:00.011 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [com.tangdi.jump.bp.service.sqlmap.impl.SqlMapImpl] DEBUG Opened SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@12af9e28] for iBATIS operation
  7. 2017-04-13 01:10:00.011 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [com.tangdi.jump.bp.service.sqlmap.support.SqlSessionUtils] DEBUG Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@12af9e28]
  8. 2017-04-13 01:10:00.012 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [com.tangdi.jump.bp.service.sqlmap.support.SqlSessionUtils] DEBUG Creating SqlSession with JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@43c10cbc]
  9. 2017-04-13 01:10:00.012 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [java.sql.Connection] DEBUG ooo Connection Opened
  10. 2017-04-13 01:10:00.012 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [com.tangdi.jump.bp.service.sqlmap.support.SpringManagedTransaction] DEBUG JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@43c10cbc] will be managed by Spring
  11. 2017-04-13 01:10:00.012 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [com.tangdi.jump.bp.service.sqlmap.support.SqlSessionUtils] DEBUG Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1159e5ac]
  12. 2017-04-13 01:10:00.012 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [com.tangdi.jump.bp.service.sqlmap.impl.SqlMapImpl] DEBUG Opened SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1159e5ac] for iBATIS operation
  13. 2017-04-13 01:10:00.012 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [java.sql.PreparedStatement] DEBUG ==> Executing: select sum(a.TRAN_AMT) from FIN_FUND_TRAN a join outcome_flow b on a.pt_no = b.pt_no and a.ser_no = b.bus_ser where "1" = a.TRAN_ACC and a.TRAN_REA = "1" and (b.RECO_STATE = "U"or b.RECO_STATE = "0" or b.RECO_STATE = "5") and a.pt_no = ?
  14. 2017-04-13 01:10:00.012 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [java.sql.PreparedStatement] DEBUG ==> Parameters: 002(String)
  15. 2017-04-13 01:10:00.014 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [java.sql.ResultSet] DEBUG <== Columns: 1

好像也执行了,但是金额为什么和数据库的表里的不一致,再查整个的定时任务日志

</>复制代码

  1. 4.13 cron
  2. 2017-04-13 01:10:00.004 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [com.tangdi.jump.bp.service.sqlmap.support.SqlSessionUtils] DEBUG Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@12af9e28] from current transaction
  3. 2017-04-13 01:10:00.004 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [com.tangdi.jump.bp.service.sqlmap.impl.SqlMapImpl] DEBUG Opened SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@12af9e28] for iBATIS operation
  4. 2017-04-13 01:10:00.004 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [com.tangdi.jump.bp.service.sqlmap.support.SqlSessionUtils] DEBUG Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@12af9e28]
  5. 2017-04-13 01:10:00.004 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [net.tangdi.gxseas.service.AutoRecon] INFO === 日切日期:2017-04-07
  6. 2017-04-13 01:10:00.004 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [net.tangdi.gxseas.service.AutoRecon] INFO 任务号:A,任务执行步骤:A01,日切日期:20170407

4月13日应该执行4.12日的,为什么执行了4.07日的了?
查下数据库定时任务日期控制表也是4,12,诡异啊?
不对,日志为什么没有执行的sql记录呢?
异常的话也不应该执行下去啊,莫名其妙,陷入了无头绪的状态.
因为mybatis的调用时用的第三方小厂家封装框架,出于对于它的不信任,看起了源码,在BaseExecutor发现看玄机

</>复制代码

  1. public List query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException {
  2. ErrorContext.instance().resource(ms.getResource()).activity("executing a query").object(ms.getId());
  3. if (closed) throw new ExecutorException("Executor was closed.");
  4. // Flush the internal cache is force is true
  5. if (ms.isFlushCacheRequired()) {
  6. clearLocalCache();
  7. }
  8. List list;
  9. try {
  10. queryStack++;
  11. CacheKey key = createCacheKey(ms, parameter, rowBounds);
  12. list = resultHandler == null ? (List) localCache.getObject(key) : null;
  13. if (list != null) {
  14. handleLocallyCachedOutputParameters(ms, key, parameter);
  15. } else {
  16. list = queryFromDatabase(ms, parameter, rowBounds, resultHandler, key);
  17. }
  18. } finally {
  19. queryStack--;
  20. }
  21. if (queryStack == 0) {
  22. for (DeferredLoad deferredLoad : deferredLoads) {
  23. deferredLoad.load();
  24. }
  25. }
  26. return list;
  27. }

调用方resultHandler传入的默认全是null,说明它会缓存拿.
因为上面的sql都没有参数,key是一定的,所以第二次之后会查缓存,但是数据时会变的,造成缓存和数据库的数据不一致.
继续看mybatis源码,发现localCache是SqlSession的成员变量.那么就可以断定如果相同的sql在同一个SqlSession执行,就会命中缓存,为了证实我的猜想,继续翻日志

</>复制代码

  1. 4.10 rishProvision
  2. 2017-04-10 01:10:00.011 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [com.tangdi.jump.bp.service.sqlmap.support.SqlSessionUtils] DEBUG Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@12af9e28] from current transaction
  3. 2017-04-10 01:10:00.011 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [com.tangdi.jump.bp.service.sqlmap.impl.SqlMapImpl] DEBUG Opened SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@12af9e28] for iBATIS operation
  4. 2017-04-10 01:10:00.011 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [java.sql.PreparedStatement] DEBUG ==> Executing: SELECT PT_NO, ACC_AMT, BOON_AMT, CUST_AMT, PRO_AMT, FEE_AMT, MX_AMT, LT_AMT, FXJT_AMT, PT_DEP_AMT, PRO_DEP_AMT, PROCOUNT, FINCOUNT, INVCOUNT, BOUNS_RATIO, LOANSUM_AMT, REPAY_RAT, LEVER_RAT, OVERDUE_RAT, OVERDUE_PRO_RAT, UPDATE_DATE, CORE_MANA_AMT, CORE_WAIT_AMT, PT_WAIT_AMT, CORE_RESULT, CORE_GUARA_AMT, CORE_BOND_WAIT_AMT, PT_BOND_WAIT_AMT, BOND_RESULT FROM PALTFORMACCOUNT
  5. 2017-04-10 01:10:00.011 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [java.sql.PreparedStatement] DEBUG ==> Parameters:
  6. 2017-04-10 01:10:00.013 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [java.sql.ResultSet] DEBUG <== Columns: PT_NO, ACC_AMT, BOON_AMT, CUST_AMT, PRO_AMT, FEE_AMT, MX_AMT, LT_AMT, FXJT_AMT, PT_DEP_AMT, PRO_DEP_AMT, PROCOUNT, FINCOUNT, INVCOUNT, BOUNS_RATIO, LOANSUM_AMT, REPAY_RAT, LEVER_RAT, OVERDUE_RAT, OVERDUE_PRO_RAT, UPDATE_DATE, CORE_MANA_AMT, CORE_WAIT_AMT, PT_WAIT_AMT, CORE_RESULT, CORE_GUARA_AMT, CORE_BOND_WAIT_AMT, PT_BOND_WAIT_AMT, BOND_RESULT
  7. 2017-04-10 01:10:00.014 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [java.sql.ResultSet] DEBUG <== Row: 006, 17115160.20, 1316359.13, 12149570.66, 3057572.01, 1638003.75, 61413.78, 0.00, 208600.00, 1316359.13, 0.00, 61841, 61841, 5, 0.00, 453419406.77, 0.68, 0.070, 0.020, 0.000, 2015-09-07 10:07:26.292735, 19534686.720, null, null, 0, 851068.580, null, null, 0
  8. 2017-04-10 01:10:00.015 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [com.tangdi.jump.bp.service.sqlmap.support.SqlSessionUtils] DEBUG Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@12af9e28]

</>复制代码

  1. 4.10 cron
  2. 2017-04-10 01:10:00.004 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [com.tangdi.jump.bp.service.sqlmap.support.SqlSessionUtils] DEBUG Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@12af9e28]
  3. 2017-04-10 01:10:00.004 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [net.tangdi.gxseas.service.AutoRecon] INFO 数据迁移到历史表,当前主机域名:znq133
  4. 2017-04-10 01:10:00.004 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [com.tangdi.jump.bp.service.sqlmap.support.SqlSessionUtils] DEBUG Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@12af9e28] from current transaction
  5. 2017-04-10 01:10:00.004 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [com.tangdi.jump.bp.service.sqlmap.impl.SqlMapImpl] DEBUG Opened SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@12af9e28] for iBATIS operation
  6. 2017-04-10 01:10:00.004 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [java.sql.PreparedStatement] DEBUG ==> Executing: SELECT TO_CHAR(MAX(DT),"YYYY-MM-DD") FROM WORK_HOLIDAY WHERE TRASTATUS = "1"
  7. 2017-04-10 01:10:00.004 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [java.sql.PreparedStatement] DEBUG ==> Parameters:
  8. 2017-04-10 01:10:00.005 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [java.sql.ResultSet] DEBUG <== Columns: 1
  9. 2017-04-10 01:10:00.005 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [java.sql.ResultSet] DEBUG <== Row: 2017-04-07
  10. 2017-04-10 01:10:00.005 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-6] [com.tangdi.jump.bp.service.sqlmap.support.SqlSessionUtils] DEBUG Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@12af9e28]

可以看出这几个SQLSession都是@12af9e28,且错误执行的数据就是这几天日志查处的,证实了我的想法

解决问题

了解下mybatis 的一级缓存,select语句默认开启,由MappedStatement的flushCache属性控制.
那么怎么把mybatis的一级缓存关闭呢?

官网说

 1.sql级别

</>复制代码

 2.全局FlushCache

mybatis->configuration.xml->setting标签添加

</>复制代码

单条关闭不适合现在的存量项目,sql太多了,排查不方便,全局吧,一运行发现mybatis3.0.6版本不支持此属性

3.mybatis插件

全局拦截MappedStatement使flushCache=true

</>复制代码

</>复制代码

  1. import org.apache.ibatis.executor.Executor;
  2. import org.apache.ibatis.mapping.MappedStatement;
  3. import org.apache.ibatis.plugin.Interceptor;
  4. import org.apache.ibatis.plugin.Intercepts;
  5. import org.apache.ibatis.plugin.Invocation;
  6. import org.apache.ibatis.plugin.Plugin;
  7. import org.apache.ibatis.plugin.Signature;
  8. import org.apache.ibatis.session.ResultHandler;
  9. import org.apache.ibatis.session.RowBounds;
  10. import java.util.Properties;
  11. /**
  12. * 关掉Mybatis所有查询的一级缓存
  13. * Created by mumubin 2017/4/13.
  14. */
  15. @Intercepts(@Signature(method = "query", type = Executor.class, args = {MappedStatement.class, Object.class,
  16. RowBounds.class, ResultHandler.class}))
  17. public class FlushCacheInterceptor implements Interceptor {
  18. @Override
  19. public Object intercept(Invocation invocation) throws Throwable {
  20. MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
  21. MappedStatement copy = copyMappedStatementFlushCache(mappedStatement);
  22. invocation.getArgs()[0] = copy;
  23. return invocation.proceed();
  24. }
  25. /**
  26. * 复制MappedStatement 并设置FlushCache=true
  27. * @param mappedStatement
  28. * @return
  29. */
  30. private MappedStatement copyMappedStatementFlushCache(MappedStatement mappedStatement) {
  31. MappedStatement.Builder builder = new MappedStatement.Builder(mappedStatement.getConfiguration(),
  32. mappedStatement.getId(), mappedStatement.getSqlSource(), mappedStatement.getSqlCommandType());
  33. builder.resource(mappedStatement.getResource());
  34. builder.fetchSize(mappedStatement.getFetchSize());
  35. builder.statementType(mappedStatement.getStatementType());
  36. builder.keyGenerator(mappedStatement.getKeyGenerator());
  37. builder.keyProperty(mappedStatement.getKeyProperty());
  38. builder.timeout(mappedStatement.getTimeout());
  39. builder.resultMaps(mappedStatement.getResultMaps());
  40. builder.resultSetType(mappedStatement.getResultSetType());
  41. builder.cache(mappedStatement.getCache());
  42. builder.useCache(mappedStatement.isUseCache());
  43. builder.parameterMap(mappedStatement.getParameterMap());
  44. builder.flushCacheRequired(true);
  45. return builder.build();
  46. }
  47. @Override
  48. public Object plugin(Object o) {
  49. return Plugin.wrap(o, this);
  50. }
  51. @Override
  52. public void setProperties(Properties properties) {
  53. }
  54. }

单元测试测试下吧,查缓存的日志

</>复制代码

  1. 2017-04-14 09:00:21.495 [main] [com.tangdi.jump.bp.service.sqlmap.support.SqlSessionUtils] DEBUG Creating SqlSession with JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@3541d281]
  2. 2017-04-14 09:00:21.496 [main] [java.sql.Connection] DEBUG ooo Connection Opened
  3. 2017-04-14 09:00:21.500 [main] [com.tangdi.jump.bp.service.sqlmap.support.SpringManagedTransaction] DEBUG JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@3541d281] will be managed by Spring
  4. 2017-04-14 09:00:27.437 [main] [com.tangdi.jump.bp.service.sqlmap.support.SqlSessionUtils] DEBUG Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@53372fcf]
  5. 2017-04-14 09:00:27.442 [main] [com.tangdi.jump.bp.service.sqlmap.impl.SqlMapImpl] DEBUG Opened SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@53372fcf] for iBATIS operation
  6. 2017-04-14 09:00:37.826 [main] [java.sql.PreparedStatement] DEBUG ==> Executing: SELECT TO_CHAR(MAX(DT),"YYYY-MM-DD") FROM WORK_HOLIDAY WHERE TRASTATUS = "1"
  7. 2017-04-14 09:00:37.826 [main] [java.sql.PreparedStatement] DEBUG ==> Parameters:
  8. 2017-04-14 09:00:37.842 [main] [java.sql.ResultSet] DEBUG <== Columns: 1
  9. 2017-04-14 09:00:37.842 [main] [java.sql.ResultSet] DEBUG <== Row: 2017-04-05
  10. 2017-04-14 09:00:37.846 [main] [com.tangdi.jump.bp.service.sqlmap.support.SqlSessionUtils] DEBUG Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@53372fcf]
  11. aa:2017-04-05
  12. 2017-04-14 09:00:59.856 [main] [com.tangdi.jump.bp.service.sqlmap.support.SqlSessionUtils] DEBUG Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@53372fcf] from current transaction
  13. 2017-04-14 09:00:59.856 [main] [com.tangdi.jump.bp.service.sqlmap.impl.SqlMapImpl] DEBUG Opened SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@53372fcf] for iBATIS operation
  14. 2017-04-14 09:00:59.857 [main] [com.tangdi.jump.bp.service.sqlmap.support.SqlSessionUtils] DEBUG Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@53372fcf]
  15. bb:2017-04-05
  16. 2017-04-14 09:00:59.857 [main] [com.tangdi.jump.bp.service.sqlmap.support.SqlSessionUtils] DEBUG Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@53372fcf]
  17. 2017-04-14 09:00:59.858 [main] [com.tangdi.jump.bp.service.sqlmap.support.SqlSessionUtils] DEBUG Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@53372fcf]

加入插件,FlushCache后的日志

</>复制代码

  1. 2017-04-14 09:51:04.864 [main] [java.sql.Connection] DEBUG ooo Connection Opened
  2. 2017-04-14 09:51:04.867 [main] [com.tangdi.jump.bp.service.sqlmap.support.SpringManagedTransaction] DEBUG JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@7722306c] will be managed by Spring
  3. 2017-04-14 09:51:04.879 [main] [com.tangdi.jump.bp.service.sqlmap.support.SqlSessionUtils] DEBUG Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1011dc21]
  4. 2017-04-14 09:51:04.880 [main] [com.tangdi.jump.bp.service.sqlmap.impl.SqlMapImpl] DEBUG Opened SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1011dc21] for iBATIS operation
  5. 2017-04-14 09:51:07.890 [main] [java.sql.PreparedStatement] DEBUG ==> Executing: SELECT TO_CHAR(MAX(DT),"YYYY-MM-DD") FROM WORK_HOLIDAY WHERE TRASTATUS = "1"
  6. 2017-04-14 09:51:07.890 [main] [java.sql.PreparedStatement] DEBUG ==> Parameters:
  7. 2017-04-14 09:51:07.905 [main] [java.sql.ResultSet] DEBUG <== Columns: 1
  8. 2017-04-14 09:51:07.905 [main] [java.sql.ResultSet] DEBUG <== Row: 2017-04-14
  9. 2017-04-14 09:51:07.909 [main] [com.tangdi.jump.bp.service.sqlmap.support.SqlSessionUtils] DEBUG Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1011dc21]
  10. aa:2017-04-14
  11. 2017-04-14 09:51:09.837 [main] [com.tangdi.jump.bp.service.sqlmap.support.SqlSessionUtils] DEBUG Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1011dc21] from current transaction
  12. 2017-04-14 09:51:09.838 [main] [com.tangdi.jump.bp.service.sqlmap.impl.SqlMapImpl] DEBUG Opened SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1011dc21] for iBATIS operation
  13. 2017-04-14 09:51:09.839 [main] [java.sql.PreparedStatement] DEBUG ==> Executing: SELECT TO_CHAR(MAX(DT),"YYYY-MM-DD") FROM WORK_HOLIDAY WHERE TRASTATUS = "1"
  14. 2017-04-14 09:51:09.840 [main] [java.sql.PreparedStatement] DEBUG ==> Parameters:
  15. 2017-04-14 09:51:09.844 [main] [java.sql.ResultSet] DEBUG <== Columns: 1
  16. 2017-04-14 09:51:09.844 [main] [java.sql.ResultSet] DEBUG <== Row: 2017-04-14
  17. 2017-04-14 09:51:09.845 [main] [com.tangdi.jump.bp.service.sqlmap.support.SqlSessionUtils] DEBUG Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1011dc21]
  18. bb:2017-04-14
  19. 2017-04-14 09:51:09.846 [main] [com.tangdi.jump.bp.service.sqlmap.support.SqlSessionUtils] DEBUG Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1011dc21]
  20. 2017-04-14 09:51:09.848 [main] [com.tangdi.jump.bp.service.sqlmap.support.SqlSessionUtils] DEBUG Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1011dc21]

ok,大功告成,bug完美解决,所以sql查询都必须查询数据库了

总结

吐槽下mybatis的设计问题,ORM好好做数据库的事情,关于缓存的事情不要做,交给redis好了,功能做就做了,但是默认开启就不对了!!! 不管是什么开源项目,都需在保证正确性的下再考虑提示性能.在提示性能有可能引入数据错误的功能应默认关闭!!!!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67016.html

相关文章

  • 一次 Mybatis 一级缓存清理无效引起的源码走读

    摘要:今天对象在学习时发现对象的方法并不能清理一级缓存同一下相同查询条件返回的结果还是旧值。测试代码如下上网搜索网上搜索找到了相同问题并没有人解答。例如查看官方文档实例有一个本地缓存在执行和时被清理。要明确地关闭它获取打算做更多的工作你可以调用。 今天对象在学习 Mybatis 时发现 org.apache.ibatis.session.SqlSession 对象的 clearCache()...

    voyagelab 评论0 收藏0
  • 记一线上频繁FGC的事件和解决方式

    摘要:直接显示了一个疑似内存泄漏的问题。然后分析文件给出的信息,发现一个叫的类。文件里面说的内存泄漏的大概的意思就是说,这个类里面的存放的东西太多了,爆掉了。修改了代码将调用的地方改成了单例。修改完线上跑了一段日子,后来也没有出现过这样的问题。 问题描述:     早上去公司上班,突然就邮件一直报警,接口报异常,然后去查服务器的运行情况,发现java的cpu爆了.接着就开始排查问题 问题解决...

    Alliot 评论0 收藏0
  • 一次惊心动魄的前端性能优化之旅

    摘要:方案未引起重视,并没有做出相应处理。页面中元素的布局是相对的,因此一个元素的布局发生变化,会联动地引发其他元素的布局发生变化。这里可以使用的和来分析的性能。写在最后性能优化是一门做减法的艺术。 欢迎一起交流 欢迎关注我的个人公众号,不定期更新自己的工作心得。showImg(https://segmentfault.com/img/bVEk23?w=258&h=258); 正文从这里开始...

    Bryan 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<