当前位置: 首页 > news >正文

单页面网站有哪些内容吗wordpress自动水印代码

单页面网站有哪些内容吗,wordpress自动水印代码,网站经常做封面的那些番号,h5制作软件 知乎记Mybaits缓存踩的坑 1.问题提出 最近开发一个记录操作前后修改内容的功能#xff0c;获取修改前数据比较简单#xff0c;直接从数据库获取#xff0c;记录修改后的功能也比较简单#xff0c;直接将用户修改的内容封装成po对象#xff0c;然后两个比对就可以了#xff…记Mybaits缓存踩的坑 1.问题提出 最近开发一个记录操作前后修改内容的功能获取修改前数据比较简单直接从数据库获取记录修改后的功能也比较简单直接将用户修改的内容封装成po对象然后两个比对就可以了问题就出在这。 2.场景复现 下面是出现问题的代码简化版操作分为用户端和管理端 用户端 public class UserServiceImpl{Autowiredprivate IUserDao userDao;Autowiredprivate IUserLogDao dao;Autowiredprivate StreamAction action;OverrideTransactionalpublic void modifyUser(UserDto dto){Long id dto.getUserId;//修改前的beanUserBean beforeBean userDao.queryUser(id);//修改后的beanBeanUtils.copyProperties(dto,beforeBean);//更新和用户有关的内容//....用户信息填充 UserLogBean userLogBean//这里需要修改和用户关联的记录所以插入一次userDao.insert(userLogBean);//用户端操作流action.request(beforeBean);} }StreamAction.request Override Transactional public void request(UserBean userBean){/*** 获取数据库原内容*/UserBean afterBean userDao.queryUser(id);//比对返回修改内容ModifyBean bean modify(userBean,afterBean);//...其他 业务//插入修改后的内容userBeanModifyDao.insert(bean); }此时去查看数据内添加的内容可以看到修改的部分被正确的比对出来了。 管理端 public class UserServiceImpl{Autowiredprivate IUserDao userDao;Autowiredprivate IUserLogDao dao;Autowiredprivate StreamActionManager action;OverrideTransactionalpublic void modifyUser(UserDto dto){Long id dto.getUserId;//修改前的beanUserBean beforeBean userDao.queryUser(id);//修改后的beanBeanUtils.copyProperties(dto,beforeBean);//更新和用户有关的内容//....用户信息填充 UserLogBean userLogBean//管理端操作流action.request(beforeBean);} }StreamActionManager.request Override Transactional public void request(UserBean userBean){/*** 获取数据库原内容*/UserBean afterBean userDao.queryUser(id);//比对返回修改内容ModifyBean bean modify(userBean,afterBean);//...其他 业务//插入修改后的内容userBeanModifyDao.insert(bean); }此时我们去数据库查看内容你就惊奇发现并没有见到修改的内容。不对啊我们确实已经修改过了那为什么数据库里不显示呢 3.发现问题 带着疑问我们很容易的想到是不是两个对象内容一模一样带着疑问我们尝试着打印一下用户端和管理端在进行比对前的两个对象内容 public void request(UserBean userBean){/*** 获取数据库原内容*/UserBean afterBean userDao.queryUser(id);System.out.println(userBean); System.out.println(afterBean); //比对返回修改内容ModifyBean bean modify(userBean,afterBean);//...... }用户端 我们在比对修改内容前打印两个bean结果如下 cn.example.core.core.bean.UserBean5e5a2b74 cn.example.core.core.bean.UserBean5e5a2b75两个bean不是同一个对象符合我们的预期所以用户端正确入库。 我们再来看管理端 管理端 管理端执行结果 cn.example.core.core.bean.UserBean5e5a2b77 cn.example.core.core.bean.UserBean5e5a2b77oi我们惊奇的发现这两个对象是一样的那就奇了怪了用户端和管理端业务代码甚至基本都一样的为什么会造成这个原因呢我们再输出这两个对象的内容 System.out.println(userBean.toString()); System.out.println(afterBean.toString());很惊奇的是这两个对象内容都是修改过的内容也就是service内通过BeanUtils属性赋值过的内容那我们mysql里的内容去哪了我们明明还没更新啊我们赶紧去数据库看一眼发现数据库里并没更新。数据库里内容没更新业务里的bean已经被更新过了这是为什么 4.排查问题 我们找到出现问题的原因了是因为管理端两个对象一样。那为什么会一样呢 我们在业务逻辑里很容易想到类似的场景比如我们在使用redis的时候当redis内有数据时我们希望走redis返回结果而不是走数据库以提高查询性能那会不会两个对象一样也是走了缓存呢我们通过查询数据库我们知道mysql的查询也会存在缓存但是按道理来说我们最后的结果应该是mysql的内容应该不会是后面的内容。所以只有一种情况是mybaits的缓存。 5.寻找答案 我们已经确定了是mybaits的缓存导致的问题但是为什么管理端和用户端还不一样呢为什么用户端就没有这个问题呢 我们百度之后发现mybaits有一、二级缓存之分二级缓存默认不开启。 哎会不会是用户端的缓存过期了因为用户端的有一个插入其他表的操作肯定比管理端慢对对一定是这个问题好我们去找度娘度娘说缓存没有过期时间。好好好这样玩好好好。 那么问题是什么我们已经确定不是过期时间的问题了那我们现在想的就是缓存过期也就是缓存失效了我们换个方法去查找内容“mybatis缓存失效的原因”我们找到以下结果 1.不在同一个sqlSession中 2.如果是增删改操作程序会clear缓存。 3.一级缓存未开启 4.手动清空缓存数据调用sqlsession.clearCache(). 5.更改查询条件我们一点点往下看 不在同一个sqlSession中 同一个事务内会复用同一个sqlSession。 具体我们查看控制台可以看到第一个sql执行之前会有一句话 Creating a new SqlSession Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession3663af34]在之后的sql执行时会有一句话 Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession3663af34] from current transaction都是同一个sqlSession 我们业务层面的代码是在同一个事务里因为没有设置事物传播机制虽然有两个事物注解但是最后都在同一个事务那可以用 String txName TransactionSynchronizationManager.getCurrentTransactionName();查看会发现事务没有失效且都在一个事物内显然不是这个原因。 如果是增删改操作程序会clear缓存。 我们用户端涉及的增删改是另外一张表的排除 一级缓存未开启 显然开启了不然不会有这篇博客 4、5不用看了都不符合 我们分析完了仍然没找到原因。那么问题到底在哪呢 目前最有可能的就是2但是我们明明更改的是其他表啊那么不妨我们就试试改其他表。 Test Transactional //这里的事务一定要加mybatis的缓存存在条件就是需要有事务否则你查询会发现两个对象怎么样都不会相同 public void test(){UserBean beforeBean userDao.queryUser(id);//更新userLogDao.update(1,1);UserBean afterBean userDao.queryUser(id);System.out.println(beforeBean); System.out.println(afterBean); }哎神奇两个对象不一样了缓存失效了所以问题就在这所以这就是造成这个bug的原因知道了问题那我们就开始做解决方案 6.解决方案 解决方案有一下几种 关闭mybatis一级缓存无法关闭只能修改状态 mybatis:configuration:cache-enabled: false #禁用二级缓存local-cache-scope: statement #一级缓存指定为statement级别 默认为session级别使用不同的对象传递 在传递前后bean的时候用其他的bean赋值传递。 使用不同的查询方式拼接条件等使用不同的事物隔离级别 //todo 到此为止我们的问题就解决了。
http://www.hkea.cn/news/14475172/

相关文章:

  • 购物帮–做特惠的导购网站绍兴专业做网站
  • 前几年做啥网站致富网站后台管理无法编辑
  • 跨平台网站制作网络优化怎么弄
  • 手机端的网站怎么做域名申请后怎么建网站
  • 邵阳高端网站建设中国建设银行门户网站企业
  • 网站经常被挂马中铁建设集团官方网站
  • 芙蓉建设官方网站网站建设保障措施
  • wordpress lampp建站白云移动网站建设
  • 网站架构基本知识中山专业手机网站建设
  • 个人免费网站制作上海招投标网官方
  • 江苏专业网站推广公司百度网站开发业务
  • 成都知名网站建设软件免费网站大全
  • 网站设计公司域名服务器建设快速网站排名优化
  • 通过骗子网站能找到其服务器吗贵阳网站建设功能
  • 网站建设和维护工作内容网络营销推广8种方法
  • 上海网站建设方案托管单页营销分享网站
  • 怎样让百度搜索到自己的网站帝国cms做漫画网站教程
  • 连云港网站关键词优化可信网站身份验证 必须做吗
  • 济源网站优化黄埔移动网站建设
  • 网站开发具体工作有那些网站设计职业工作室
  • 下载wix做的网站php软件网站建设
  • 山东城乡建设厅网站首页抖音 运营
  • 网站制作模板过程北京各大网站推广平台哪家好
  • 西安演出公司网站建设福田做网站福田网站建设福田建网站500
  • 网站如何快速收录广州网站设计哪家公司好
  • 河南秋实网站建设手机app开发定制公司
  • 长春制作网站哪家好lovevideo门户视频wordpress主题
  • 哈尔滨服务专业的建站wordpress百度统计代码
  • 廊坊市固安县建设局网站全国十大装饰公司最有名的是
  • 网站推广原则如何建设视频网站