JAVA找BUG之OOM

大家好哇,我是梦辛工作室的灵,在最近的工作中,又遇到了一个bug,系统运行一段时间后就会频繁OOM,然后直接假死或退出,一度折磨着我,后面不停的翻日志查GC,最后才终于确认位置,大家先看下下面的代码:

	public Customer queryByOpenIDorUnionId(String openid, String unionId) { 
        Map<String, String> rp = new HashMap();
        rp.put("unionid", unionId);
        rp.put("openid", openid);
        Customer customer = this.customerMapper.selectByUnionIdOrOpenId(rp);
        this.fillRemainnMoney(customer);
        return customer;
    }
   <select id="selectByUnionIdOrOpenId" parameterType="map" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List"/>
        from customer_info
        <where>
            <if test="unionid != null  and unionid!=''">
               and unionid = #{unionid}
            </if>
            <if test="openid!=null  and openid!=''">
               and openid = #{openid}
            </if>
        </where>
    </select>

其实你晃眼一看感觉没什么问题对吧,就是一个简单的查询,但是你有没有想到万一传进来的值 openid 和 unionid 都为null的时候,就有问题了,这里的mysql就回去查询全表,如果你表里面的数据较多的话,例如50多万条数据,那么这里就可能会不断映射对象,创建50多万的对象,这是致命的,所以像这里如果确定返回记录就只有一条,最好 加上limit 1,在调用方法的时候也一定要先判空,不然后续找bug的时候会异常痛苦=-=
收,大家一定要注意这些小细节哇

你可能感兴趣的:(java,bug,开发语言)