记一次SQL语句的问题导致的生产上出现大问题的经历

由于SQL语句写错的问题,导致生产上出现问题。

代码如下:

public List<classA> findByA(String a){
        StringBuffer sql = new StringBuffer();
        sql.append("SELECT * ")
                .append("FROM abc ")
                .append("WHERE status = :valid ")
                .append("AND active_status = :active_status ")
                .append("AND ada = :ada");

        Query query = entityManager.createNativeQuery(sql.toString(), classA.class);
        // 有效状态
        query.setParameter("valid", 1);
        query.setParameter("active_status", 1);
        query.setParameter("A", a);

        List<classA> list = query.getResultList();
        if (org.springframework.util.CollectionUtils.isEmpty(list)) {
            return null;
        }
        return list;
    }

由于这里是用JPA来实现SQL语句的,而我在调用这个方法时候,传进去之前,a没有进行null判断,导致a有可能会传一个null进去,从而导致引擎放弃使用索引而进行全表扫描。

举个例子:

select id from t where num is null 

        所以导致每一次出现null值的情况都进行一次全表查询,而表中有好几百万条数据 _(¦3」∠)_ ,所以APP响应速度奇慢无比。之前因为在QA环境测试的时候,QA环境表中只有几百条数据,所以忽略了这个问题,对速度没感知到。

 

     最终解决方案:在调用Dao层之前的service层对a值是否为空进行判断和控制,才终于解决这个问题。

好吧,下次要注意这种情况。而且自己需要去了解一下sql的调优,尽量杜绝这种上了生产才出现问题的情况再发生。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值