Java客户端Socket在服务端重启后的异常情况处理
碰到场景如下:Java服务器端A(使用NIO的异步IO方式),Java客户端B(使用普通IO的同步方式),在服务端A重启后,B->A的Socket毫无疑问的断了,然后就会出现一些异常情况,分析一下。
碰到场景如下:Java服务器端A(使用NIO的异步IO方式),Java客户端B(使用普通IO的同步方式),在服务端A重启后,B->A的Socket毫无疑问的断了,然后就会出现一些异常情况,分析一下。
long值转为int会造成溢出大家都知道,很多时候却会忽视已发bug,造成明明的正值变为了负值(因为int最高位非0,long值大于int最大值2^31-1=2147483647
)。
此次出错的地方在使用java.util.Collections.sort
中使用Comparator
接口中,因为compare方法通过返回int值来比较大小,而逻辑比较大小是通过比较时间戳long值按最近时间排序,一开始不注意就直接把时间戳long值差给直接转为int值返回了,造成了可能的排序错误(有趣的是只需要24天的毫秒值就会超过int的最大值
)。
线上服碰到诡异问题,解析一段无参数固定代码生成的时间字符串获得时间戳,不定概率出现解析异常,堆栈如下。
产生的原因,因为SimpleDateFormat每次new的代价比较高,固定new一个后重复使用。一开始并没有对输入字符串进行日志打印,就以为是输入字符串的错误,就难以定位到产生问题的原因。
一个Java项目,无论怎么替换jar包Jar1,运行中某个类A无法加载到最新的class,一直以替换前的旧版本运行导致报错;而Jar1中新加入的类B可以被正确执行,每次替换jar包都能加载到B最新的class。 阅读更多…
多年没有碰Java Web了,之前也一直在Windows下玩耍。在Linux下跑起Tomcat也折腾了一阵。
看Apache Tomcat官网,已经有Tomcat 8.x(据说支持Oracle Java 7.0标准),7.x和6.x,习惯还是使用6.0.44版本。
一直用的dreamhost国外的主机,前些日子感觉越来越不好使,速度慢不说,经常根本无法连接上,FTP更是慢大部分时候无法上传和下载。然后国内环境又碰到好多网站设置需要域名备案号的,不然无法使用某些功能,比如国内的广告商、微信网页安全授权等。
前些日子,在微博上偶然发现阿里云虚拟主机免费使用,赶紧尝试了一个,还挺好用的,毕竟咱博客就是个小网站足够了。于是就开始了域名备案和数据迁移。
虽然有点恶心域名备案这个事情,但想想咱也不干什么坏事,毕竟国内网速快啊。 阅读更多…
JSON规范规定,字符串需要用Unicode传输,而对于ASCII码中的前32个不可打印字符(第33个字符为空格)应该转化为明文的转义模式,比如换行符0A:”\n”,出现在json中就应该是明文的\n,所以内部表示就应该是”\\n”。
所以假如一个json字符串中出现了01-1F这31个字符(00空字符倒是不会出现错误),json就会解析错误。
开发Cordova的APP使用到下面几个原生或者开源第三方的插件,很好用
1.Notification
org.apache.cordova.dialogs和org.apache.cordova.vibration
取代原生alert(不能控制title),提供丰富的alert、confirm等API
2.InAppBrower
org.apache.cordova.inappbrower
可以在APP内部新开一个页面打开浏览器,可以关闭
3.Network Infomation
org.apache.cordova.network-infomation
检查网络类型和状态,可以检查出当前网络是2G/3G/4G/WIFI,有事件监听断网和连网
4.Camera
org.apache.cordova.camera
调用摄像头或从文件夹中选取,可以获取图片base64后的数据
5.Screen Orientation
net.yoik.cordova.plugins.screentorientation
可以使用screen.lock等API, 锁定或者解锁屏幕转动
6.BarcodeScanner
com.phonegap.plugins.barcodescanner
https://github.com/wildabeast/BarcodeScanner/ 主页地址
可以扫描二维码等,获取内部的文本信息和文本类型
在某些数据库表中,比如记录的是一些关联关系,比如某个人关注了另外一个人,person_id和target_id,这种数据表的数据如果出现了重复,可能会引起程序上其他地方的诡异bug,要尽量保持数据的唯一性。这种数据重复,要不就是插入数据时根本没有做存在检查,或者是可能由二次提交产生的比较麻烦的并发情况。
1. 代码层做同步控制,利用锁机制
2. 在数据查重时利用数据库事务 + SQL层加入排他锁,select * from xx where ... lock for update
3. 数据库层Unique检查,建表时加入unique的索引
前两个方法在代码层面,比较容易控制,第三种方法最彻底但是出现冲突时候会报异常。
不过如果在高并发的情况下,使用第三种方式然后主动捕获异常,也是很不错的甚至是最好的。
相比较于Java String的编码转换(先将String根据原字符集转化为字节数组,然后再用字节数组根据新字符集拼装成新的字符串),Ruby的字符串编码转化省去了中间字节数组的过程,直接string.encode(new_encoding)
即可。
rails程序中要调用一个系统命令,但是这个系统命令在某些时候可能会处理很久也得不到结果,就需要控制超时情况。
刚接触rails的时候着实被has_many给惊到,这么厉害的功能,尤其是has_many的延迟加载,直到真正需要读取数据的时候才会进行SQL查询(person.posts.size,并不会执行select *到内存后再对Array执行size),但是用普通的调试方法怎么看has_many的结果是一个Array,比如.class方法,然后就觉得很神奇。
需要一个windows环境下的工具,能够读写Excel。这个Excel比较复杂,内嵌VB脚本,写Excel的时候必须得保留这些原有的脚本数据。
项目中用到Rails2.3.5,就以此版本研究。和Rails本身相关的,大概有actionmailer(发邮件相关)、actionpack(HTTP和controller相关)、activerecord(ORM框架)、activeresource、activesupport(基础扩展库)。