Java Web技术经验总结(十四)

  1. try-catch的异常打印原则:(1)优先catch具体异常,最后catch通用异常Exception;(2)异常日志打印需要将入参、结果和请求打印出来,方便排查问题;

  2. 利用HTTP CLIENT发送GET请求时,必须URL Encode.

  3. MySQL和Mybatis的批量更新操作,最近遇到一种情况,需要给多个字段更新成不同的值,最后参考:Mybatis之批量更新操作这篇文章搞定的。

  4. 利用MyBatis写批量插入或者更新的语句,假设参数列表的大小为x,则返回值的范围是[x,2x]。


    INSERT INTO test(fans_id, test_id, openid, nickname, picture,update_time, create_time)
    VALUES
    
        (#{item.fansId}, #{item.testId}, #{item.Openid}, #{item.nickName}, #{item.picture},#{item.updateTime},#{item.createTime})
    
    ON DUPLICATE KEY UPDATE nickname=VALUES(nickname), picture=VALUES(picture), update_time=VALUES(update_time)

  1. 关于断言的使用:我查了下资料,JVM通过-ea配置项控制断言是否打开,默认是关闭的。用在生产项目中的时候,一定不能做的事情是用断言决定业务逻辑,我下午那么用有风险。准备再梳理一遍代码,采取两个方式处理dao层的返回值:(1)上层业务明确需要知道DB操作是否成功,通过逻辑判断返回true or false;(2)上层业务不强关心DB操作是否成功,通过逻辑判断,如果db操作失败,仅仅打印warn日志。

  2. 当你想用Thread.sleep()方法的时候,可以优先使用TimeUnit.SECONDES.sleep(x)接口,代码可读性更好。参见:优先使用TimeUnit类中的sleep()

  3. 最近做一点和微信相关的工作,从微信那边取回来的粉丝昵称中如果有表情符号,存放到MySQL中的时候出现乱码,解决的办法就是:检查JDBC连接、druid连接、MYSQL表的字符集等方面。参考:微信nickname乱码(emoji)及mysql编码格式设置(utf8mb4)解决的过程

  4. 在进行数据迁移的时候,需要从某张表里查询一批数据,最先使用了普通的分页查询,代码如下:

SELECT *
FROM fans
WHERE mp_id=#{mpId}LIMIT #{offset},#{count}

这个语句如果只是查询前面几页,或者是表的数据量不大(小于10万),就没有问题,否则就会出现慢查询。参考文章:【MySQL】 性能优化之 延迟关联进行了优化。

  1. 今天遇到一个JSON解析失败的案例,错误表现为:
    "com.alibaba.fastjson.JSONException: unclosed string : ^Z",最后查出来是fastjson的锅,我用的fastjson为1.2.0的,版本太低,这个问题在fastjson 1.2.9解决掉了。参考:github issue

本号专注于后端技术、JVM问题排查和优化、Java面试题、个人成长和自我管理等主题,为读者提供一线开发者的工作和成长经验,期待你能在这里有所收获。


Java Web技术经验总结(十四)_第1张图片
javaadu

你可能感兴趣的:(Java Web技术经验总结(十四))