61.Redis的key要判断null的情况。
如果key为null,报错。
public Boolean exists(String key) {
if(StringUtils.isBlank(key)){
return false;
}
return loginRedisTemplate.hasKey(key);
}
另外原因分析,看了错误信息,发现是
org.springframework.util.Assert.notNull.
猜测,用Spring Data和redis连接,Spring会断言key不为null。
62.Chrome坑爹货。
桌面快捷方式,需要双击2次,再双击2次,才能打开。
加到快速启动栏,得点1次,再点1次,才能打开。
63.数据库连接太多。
云服务器上的mysql默认开的连接数比较少,大概在30~50。
线上跑了好几个程序。
wxdemo 10个,xp2p 20多个。
本地,又跑了2个程序,经常出现数据库连接过多的情况。
无奈之下,把本地的bonecp数据源的连接池数目调小了一点,暂时没有出现问题了。
经常出现“数据库连接过多”,开发效率降低了不少。
<property name="maxConnectionsPerPartition" value="${jdbc.maxConnectionsPerPartition}" />
<property name="minConnectionsPerPartition" value="${jdbc.minConnectionsPerPartition}" />
<property name="idleConnectionTestPeriodInSeconds" value="${jdbc.idleConnectionTestPeriodInSeconds}" />
<property name="idleMaxAge" value="${jdbc.idleMaxAge}" />
<property name="acquireIncrement" value="${jdbc.acquireIncrement}" />
bonecp.ConnectionHandle - uid:1000000179@fansunion 127.0.0.1 Database access problem.
Killing off all remaining connections in the connection pool. SQL State = 08S01
64.分布式登录。
Cookie,登录之后,设置Cookie。
maxAge为-1,表示浏览器关系Session就小时。
也可以设置为>0的数值,比如1*24*60*60,保持登录1天。
有一点是需要注意的,除了浏览器Cookie的时间,保存在Redis缓存中的Cookie也有时间限制。
每次有请求访问的时候,重新设置redis的时间。
错误的情况:登录之后,把Cookie保存在Redis中30分钟。如果,用户最近一直访问,30分钟之后,也会“离线”。
这是不科学的。
正解:每次访问,都要重新向Redis中更新Cookie缓存。
如果是保持登录的情况,比如保持登录一周,不需要。
要不然,用户每天都访问,可以一直保持登录,从而超过了一个周。
(这个地方挺关键的,总结的过程中,发现了这个bug。)
65.Redis反序列化。
第1次,存储com.jiutianniao.User到Redis。
第2次,重构User为com.jiutianniao.User2,连接Redis,提示“反序列化异常”,因为找不到User对象了。
解决办法:
清空Redis数据库:FLUSHDB 清除一个数据库,FLUSHALL清除整个redis数据。
66.OSChina的Git项目,有个比较让人郁闷的问题。
第1步:新建项目,比如oa。不初始化项目。
第2步:本地,Eclipse新建项目,项目名称为oa。
第3步:本地提交到远程。
坑爹的地方,就是这。
本地工程提交到OSChina之后,项目的路径是:/oa/oa。
这个时候,另外一个开发者,从Git上导出项目,结果是个目录/oa/oa。
第4步:把/oa/oa向上移动一个目录,再提交。
之前在Java Web项目中,没有遇到太大问题。可能是因为都是Maven项目,重新转换成Maven项目就好了。
今天的项目是Android,向上移动一个目录之后,不再是一个工程。
又不能向Maven项目那样,重新转换一次就好了。
尝试了几个小时,终于找到了方法。
把正常Android的.project的内容,覆盖非正常Android项目的.project的内容。
67.保持登录和缓存导致的bug。
后端用户登录,把当前权限列表保存到Redis中了。
有的权限,更新了下。
重启系统,自动登录了,使用的仍然是旧的权限列表。
有些菜单一直访问不了。
68.下载的问题。
在个人中心等需要登录的地方,如果有下载,通过浏览器可以正常下载。
通过,迅雷等专用下载器就不行了,因为Cookie没有保存。
最开始,我想的是,让这些下载链接改成不需要登录的,刚刚又想了下,
这样太危险了,容易泄漏数据。
69.快速构造字符串的一种方法。
方法1:
String url = "http://jiutianniao.com/demo.html?a="+a+"&b"=b;
方法2:
public final static String token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
token_url.replace("APPID", appid).replace("APPSECRET", appsecret);
先使用占位符,然后字符串整体替换。
70.微信第2个Demo小坑2个。
a.按钮类型Java定义:
//这个地方,不能改为subButton
private Button[] sub_button;
看了不爽,把sub_button改成了subButton,最终影响到了序列化,出现“按钮类型错误”。
b.用户事件类型区分大小写
public enum EventType {
// 订阅
SUBSCRIBE("subscribe"),
// 取消订阅
UNSUBSCRIBE("unsubscribe"),
// 用户已关注时的扫描带参数二维码
SCAN("scan"),
// 上报地理位置
LOCATION("LOCATION"),
// 自定义菜单
CLICK("CLICK");
}
大部分的事件等都是“小写表示”,看到了几个“大写”的,很是不爽,
改成了小写,结果就出事了。
可能是“微信那边的历史遗留问题”吧。