Ticket #117 (new defect) — at Version 3

Opened 13 years ago

Last modified 13 years ago

商城6.1版上线时发生的灵异事件

Reported by: huangzhong Owned by:
Priority: major Milestone:
Component: 商家后台 Version: 6.1
Keywords: Cc:
Due Date: 18/10/2012

Description (last modified by chenchongqi) (diff)

  • 现象

应用上线后,功能检查一切正常,突然1点数据库负载变高,去到了4左右,让dba抓了下慢语句,发现大量类似如下的SQL语句

SELECT t0.IMG1, t0.IMG2, t0.IMG3, t1.id, t1.BIG_PIC_PATH,
 
t1.BRAND_NAME, t1.LAST_COUNT_ORDER, t1.CREATE_DATE, t1.FORUM_PATH, 

t1.HOT_NEW, t1.MID_PATH, t1.name, t1.ORDER_KEY, t1.price, 

t1.PRICE_CONFIG, t1.PUB_URL, t1.REVIEW_STATUS, t1.SHORT_NAME, 

t1.PIC_PATH, t1.SMALLTYPE_ID, t1.TYPE_ID, t1.VARIANCE_ID FROM 

ENT_PRODUCT t0 LEFT OUTER JOIN V_PDL_PRODUCT t1 ON t0.PRODUCT_ID = 

t1.id WHERE t0.id = $1

  • 检查

找遍了整个应用,都没有找到这个SQL语句的出处,IMG1, IMG2, IMG3是本次上线中商品表(ent_product)的新增字段,存放商品的图片信息,起初怀疑是商品详情页出现的问题,因为只有这个页面才会用到这几个字段,让网络对外封闭了239.45服务器,然后让dba只抓取通过239.45过来的慢语句,直接访问239.45的商品详情页,但没出现这些SQL。各种找,各种忙,都没有头绪,后来在崇锜的帮组下通过threads.jsp定位到了两个很值得怀疑的jsp,这个两个jsp都是提供给其他应用调用的接口,把这两个接口的数据库访问语句去掉以后,数据库负载立即下降,而且上面的SQL语句也出现的没那么频繁

  • 原因

这里提下商城的背景,比较容易理解。
ent_product表:商城的商品表(有效和无效的商品都有),对应CompanyProduct类
v_ent_product视图:商城的有效商品视图(为了提高性能,数据量是ent_product的1/3)
v_ent_product1表:v_ent_product的基表,由定时任务填充数据并切换
v_ent_product2表:v_ent_product的基表,由定时任务填充数据并切换
v_pdl_product视图:产品视图

经常在接口中查询v_ent_product,然后组装成CompanyProduct对象,这时问题就出现了。前面提到过ent_product表有变更,新增了三个字段,但是v_ent_product里没有新增,这个视图对应的v_ent_product1和v_ent_product2表中也没有新增这三个字段,从v_ent_product中获得数据并组装成CompanyProduct对象的时候,jpa不会报错,反而自动做些事情,它发现结果集中缺少IMG1、IMG2、IMG3这三个属性,就自动从ent_product中拿这三个属性补全

  • 解决方案

把v_ent_product1、v_ent_product2和v_ent_product都加上这三个字段。


补充一下,如果表里有img1、img2、img3的数据的话,我估计他只会组装这样的sql拿一次,而不是像上线这种情况反复拿,大家可以自行验证一下。

Change History

comment:1 Changed 13 years ago by huangzhong

  • Description modified (diff)

comment:2 Changed 13 years ago by huangzhong

  • Description modified (diff)

comment:3 Changed 13 years ago by chenchongqi

  • Description modified (diff)
Note: See TracTickets for help on using tickets.