Java Web技术经验总结(十四)
-
try-catch的异常打印原则:(1)优先catch具体异常,最后catch通用异常Exception;(2)异常日志打印需要将入参、结果和请求打印出来,方便排查问题;
-
利用HTTP CLIENT发送GET请求时,必须URL Encode.
-
MySQL和Mybatis的批量更新操作,最近遇到一种情况,需要给多个字段更新成不同的值,最后参考:Mybatis之批量更新操作这篇文章搞定的。
-
利用MyBatis写批量插入或者更新的语句,假设参数列表的大小为x,则返回值的范围是[x,2x]。
<insert id="batchInsertOrUpdateWechatFans" parameterType="java.util.List">
INSERT INTO test(fans_id, test_id, openid, nickname, picture,update_time, create_time)
VALUES
<foreach collection="list" item="item" index="index" separator="," >
(#{item.fansId}, #{item.testId}, #{item.Openid}, #{item.nickName}, #{item.picture},#{item.updateTime},#{item.createTime})
</foreach>
ON DUPLICATE KEY UPDATE nickname=VALUES(nickname), picture=VALUES(picture), update_time=VALUES(update_time)
</insert>
-
关于断言的使用:我查了下资料,JVM通过-ea配置项控制断言是否打开,默认是关闭的。用在生产项目中的时候,一定不能做的事情是用断言决定业务逻辑,我下午那么用有风险。准备再梳理一遍代码,采取两个方式处理dao层的返回值:(1)上层业务明确需要知道DB操作是否成功,通过逻辑判断返回true or false;(2)上层业务不强关心DB操作是否成功,通过逻辑判断,如果db操作失败,仅仅打印warn日志。
-
当你想用Thread.sleep()方法的时候,可以优先使用TimeUnit.SECONDES.sleep(x)接口,代码可读性更好。参见:优先使用TimeUnit类中的sleep()
-
最近做一点和微信相关的工作,从微信那边取回来的粉丝昵称中如果有表情符号,存放到MySQL中的时候出现乱码,解决的办法就是:检查JDBC连接、druid连接、MYSQL表的字符集等方面。参考:微信nickname乱码(emoji)及mysql编码格式设置(utf8mb4)解决的过程
-
在进行数据迁移的时候,需要从某张表里查询一批数据,最先使用了普通的分页查询,代码如下:
SELECT *
FROM fans
WHERE mp_id=#{mpId}LIMIT #{offset},#{count}
这个语句如果只是查询前面几页,或者是表的数据量不大(小于10万),就没有问题,否则就会出现慢查询。参考文章:【MySQL】 性能优化之 延迟关联进行了优化。
- 今天遇到一个JSON解析失败的案例,错误表现为:
"com.alibaba.fastjson.JSONException: unclosed string : ^Z",最后查出来是fastjson的锅,我用的fastjson为1.2.0的,版本太低,这个问题在fastjson 1.2.9解决掉了。参考:github issue