java中致命的sort问题
前段时间,我们的系统遇到了一个很奇怪的问题,当系统压力比较大时,常常会出现登陆用户没有权限的问题,退出再次登录就好了。
用户的权限我们是存放在内存中做实时刷新的,每当用户权限设置改变就会动态刷新。
难道是内存刷新机制出了问题?禁止内存刷新后,问题依旧,看来是别的问题所致。
后来当出错时就将内存中的用户权限集合打印到log中,经过比对发现,用户权限的总数是对的,就是colletion中重复的记录。
有重复的记录,也就是说有些权限被冲掉了,怎么会冲掉哪?最后定位在了cellection.sort身上。
原来collection中的url是不排序的,为了正则表达式对比的需要,必须排序。所以在比对之前先做collection.sort的排序。将排序拿掉,一切OK。
原因分析如下:collection.sort方法是非线程安全的,刚刚sort到一半,被复制到别处时,就是这个集合中的前一半是sort后的结果,后一半是未sort的结果,这个collection中的值就乱套了。
结论和教训:在涉及到多线程问题时,要特别的小心,千万不要使用非线程安全的方法。
相关文档:
参考:
http://danadler.com/jacob/
http://jakarta.apache.org/poi/
http://www.onjava.com/pub/a/onjava/2003/01/22/poi.html
http://www.csdn.net/develop/article/15/15311.shtm
http://forum.java.sun.com/thread.jsp?forum=40&thread=382666&tstart=0&trange=15
Java Excel ......
在这开始之前,我们得先了解一下什么是https。
https (Secure Hypertext Transfer Protocol) = 安全超文本传输协议
https的特点是:
1.数据加密(SSL) = Secure Socket Layer
2.身份认证
当你的项目需要考虑安全性的时候,部分模块可以用到https。当然这些都得到CA注册,要钱钱的哦。
这里我想给大家介绍个不收费的 ......
一、建表
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`ID` int(11) NOT NULL auto_increment,
`NAME` varchar(16) NOT NULL default '',
`REMARK` varchar(16) NOT NULL default '',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8;
&nb ......
首先,打开MySQL Query Browser,在当前Test数据库下,新建一个student表,有如下属性:
create table student (name varchar(10),id int(2),sex varchar(10));
程序见下:
package com.JDBC;
import java.sql.*;
public class JDBCTest {
public static void main(String[] args) {String driver = "com.mys ......