博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
记一次新建操作(insert)的优化过程
阅读量:4113 次
发布时间:2019-05-25

本文共 3267 字,大约阅读时间需要 10 分钟。

1.插入操作的sql语句

Mysql的 insert常用方法——插入后返回插入成功后的主键

SELECT LAST_INSERT_ID() ]]>

上面的方法利用的是mysql的LAST_INSERT_ID()函数会返回当前连接上次插入记录的自增主键。

2.Repo层的一写多读模式,层层优化

  • 最原始语句
public long insert(BudgetPlanBO budgetPlanBO) {
LoggerUtil.debug(LOGGER, "insert", budgetPlanBO); return ucdpBudgetPlanDAO.insert(BudgetPlanConvertor.convertBOtoDO(budgetPlanBO)); }
  • 添加唯一索引防重插功能
public long insert(BudgetPlanBO budgetPlanBO) {
LoggerUtil.debug(LOGGER, "insert", budgetPlanBO); try {
return ucdpBudgetPlanDAO.insert(BudgetPlanConvertor.convertBOtoDO(budgetPlanBO)); } catch (DuplicateKeyException e) {
return ucdpBudgetPlanDAO.queryByUniqueId(budgetPlanBO.getPlanType().name(), budgetPlanBO.getBizDate(), budgetPlanBO.getBizCode()).getId(); } }

以上的日志打印存在严重问题,不仅在线上环境打不了日志,而且打出来的日志没有具体参数,没有排查的实际帮助意义。

  • 优化日志版
public long insert(BudgetPlanBO budgetPlanBO) {
LoggerUtil.info(LOGGER, "[createBudget]插入预算:{0}", budgetPlanBO); try {
//same as above. } catch (DuplicateKeyException e) {
//same as above. } }

存在两个问题:

以上语句只是一次创建,在实际项目中一个接口要进行200+次的批量创建。开发环境没问题,但在预发环境中批量创建出现了部分成功部分失败的问题。唯一索引的搜索,使得本语句变成了一写多读的情况。就会导致一直返回0,因为写连接跟读连接不是同一个,解决方法是通过开启事务,强制使用同一连接进行读写。除非一定要获取插入id的情况,否则不推荐使用事务来获取插入id。

  • 添加事务版
public long insert(BudgetPlanBO budgetPlanBO) {
LoggerUtil.info(LOGGER, "[createBudget]插入预算:{0}", budgetPlanBO); return this.ucdpMngTransactionTemplate.execute(new TransactionCallback
() {
@Override public Long doInTransaction(TransactionStatus transactionStatus) {
try {
return ucdpBudgetPlanDAO.insert(BudgetPlanConvertor.convertBOtoDO(budgetPlanBO)); } catch (DuplicateKeyException e) {
return ucdpBudgetPlanDAO.queryByUniqueId(budgetPlanBO.getPlanType().name(), budgetPlanBO.getBizDate(), budgetPlanBO.getBizCode()).getId(); } catch (Throwable e) {
LoggerUtil.error(LOGGER, "[insert]插入预算异常, Exception={0}", JSON.toJSONString(e)); transactionStatus.setRollbackOnly(); throw new UcdpMngException(e.getMessage()); } } }); }

转载地址:http://tbrsi.baihongyu.com/

你可能感兴趣的文章
collect2: ld returned 1 exit status
查看>>
C#入门
查看>>
查找最大值最小值
查看>>
C#中ColorDialog需点两次确定才会退出的问题
查看>>
数据库
查看>>
nginx反代 499 502 bad gateway 和timeout
查看>>
linux虚拟机安装tar.gz版jdk步骤详解
查看>>
python猜拳游戏
查看>>
python实现100以内自然数之和,偶数之和
查看>>
python数字逆序输出及多个print输出在同一行
查看>>
ESP8266 WIFI数传 Pixhaw折腾笔记
查看>>
苏宁产品经理面经
查看>>
百度产品经理群面
查看>>
去哪儿一面+平安科技二面+hr面+贝贝一面+二面产品面经
查看>>
element ui 弹窗在IE11中关闭时闪现问题修复
查看>>
vue 遍历对象并动态绑定在下拉列表中
查看>>
Vue动态生成el-checkbox点击无法选中的解决方法
查看>>
python __future__
查看>>
MySQL Tricks1
查看>>
python 变量作用域问题(经典坑)
查看>>