自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(4)
  • 资源 (5)
  • 收藏
  • 关注

原创 crontab设置服务自启动

生产上因硬件故障宕机后操作系统重启,服务没有自动启动需要手动启动,但是通常管系统的人是不会清楚当前这台设备上到底部署了哪些应用,管应用系统的人也不会指导当前宕机的这台设备是不是自己应用所在的那台设备的,所以导致有时候应用没启动也没人知道,但是如果设置了服务开机启动就不会出现这种情况了。1、执行crontat -e2、插入@reboot (sleep 3;sh /path/somesc...

2019-07-19 10:43:58 1285

原创 关于负载的几点理解

负载有软负载和硬负载,所谓软负载即采用软件负载方式,硬负载使用硬件负载方式,通常所用的负载都是使用软负载,因为硬件设备及其昂贵。先说说软负载,比如说你有两台应用需要做负载,这时候就要注意其他需要三台设备,一台设备需要单独搭载负载,如果把软负载安装在应用服务器上是无法很好的实现负载功能的。硬负载,常见的有F5,Radware,价格都是已万计,常见于对服务要求很高的企事业单位,互联网公司常见的应该...

2019-07-18 16:26:49 710

原创 系统部署全流程之网络篇

近日糸统开发测试完成准备投产流程,鉴于我司繁杂多变的规章流程,我提前了近两个月开始准备设备及网络,但还是直到上线前一天才将网络全部调试通过,现跟大家分享一下在网络申请过程中的各种问题。首先在系统上线前我详细整理了所涉及到的所有网络访问控制,因系统较为复杂,涉及到多个旧有系统、一个新系统、以及多个第三方外部系统的通讯,我整理系统所涉及到的源地址、目标地址、访问端口、协议,汇总成了详细的网络访问控...

2019-07-18 08:52:54 1170

原创 系统部署之系统及运维篇

系统准备上线了,鉴于系统组和网络组同事的磨叽性格,我提前两个月向系统组申请设备及配置相关中间件,并在同事的提醒下系统组通常会对你所申请的系统打折扣,比如8G内存他会只给你4个G,所以准备系统信息的时候尽量多写点,免了打折和后续再扩容的麻烦。这里简单陈述下在设备申请的注意事项:1、首先对新系统所需要的设备及中间件有个清楚的思路,需要几台设备,是虚拟机还是PC机,linux系统还是aix系统,是否...

2019-07-18 11:13:22 1203

webpack安装包

webpack安装包

2018-11-24

Session Cookie的HttpOnly和secure属性

一、属性说明: 1 secure属性 当设置为true时,表示创建的 Cookie 会被以安全的形式向服务器传输,也就是只能在 HTTPS 连接中被浏览器传递到服务器端进行会话验证,如果是 HTTP 连接则不会传递该信息,所以不会被窃取到Cookie 的具体内容。 2 HttpOnly属性 如果在Cookie中设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息,这样能有效的防止XSS攻击。 对于以上两个属性, 首先,secure属性是防止信息在传递的过程中被监听捕获后信息泄漏,HttpOnly属性的目的是防止程序获取cookie后进行攻击。 其次,GlassFish2.x支持的是servlet2.5,而servlet2.5不支持Session Cookie的"HttpOnly"属性。不过使用Filter做一定的处理可以简单的实现HttpOnly属性。GlashFish3.0(支持servlet3.0)默认开启Session Cookie的HttpOnly属性。 也就是说两个属性,并不能解决cookie在本机出现的信息泄漏的问题(FireFox的插件FireBug能直接看到cookie的相关信息)。 二、实例 项目架构环境:jsp+servlet+applet

2013-10-29

java汉字排序

Java代码 1.import java.util.Comparator; 2.import net.sourceforge.pinyin4j.PinyinHelper; 3./** 4. * 汉字按照拼音排序的比较器 5. * @author KennyLee 2009-2-23 10:08:59 6. * 7. */ 8.public class PinyinComparator implements Comparator { 9. public int compare(Object o1, Object o2) { 10. char c1 = ((String) o1).charAt(0); 11. char c2 = ((String) o2).charAt(0); 12. return concatPinyinStringArray( 13. PinyinHelper.toHanyuPinyinStringArray(c1)).compareTo( 14. concatPinyinStringArray(PinyinHelper 15. .toHanyuPinyinStringArray(c2))); 16. } 17. private String concatPinyinStringArray(String[] pinyinArray) { 18. StringBuffer pinyinSbf = new StringBuffer(); 19. if ((pinyinArray != null) && (pinyinArray.length > 0)) { 20. for (int i = 0; i < pinyinArray.length; i++) { 21. pinyinSbf.append(pinyinArray[i]); 22. } 23. } 24. return pinyinSbf.toString(); 25. } 26.}

2013-10-29

SQL 优化原则

(转)SQL 优化原则 一、问题的提出  在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一。系统优化中一个很重要的方面就是SQL语句的优化。对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统不是简单地能实现其功能就可,而是要写出高质量的SQL语句,提高系统的可用性。   在多数情况下,Oracle使用索引来更快地遍历表,优化器主要根据定义的索引来提高性能。但是,如果在SQL语句的where子句中写的SQL代码不合理,就会造成优化器删去索引而使用全表扫描,一般就这种SQL语句就是所谓的劣质SQL语句。在编写SQL语句时我们应清楚优化器根据何种原则来删除索引,这有助于写出高性能的SQL语句。   二、SQL语句编写注意问题   下面就某些SQL语句的where子句编写中需要注意的问题作详细介绍。在这些where子句中,即使某些列存在索引,但是由于编写了劣质的SQL,系统在运行该SQL语句时也不能使用该索引,而同样使用全表扫描,这就造成了响应速度的极大降低。   1. IS NULL 与 IS NOT NULL   不能用null作索引,任何包含null值的列都将不会被包含在索引中。即使索引有多列这样的情况下,只要这些列中有一列含有null,该列就会从索引中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能。   任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的。   2. 联接列   对于有联接的列,即使最后的联接值为一个静态值,优化器是不会使用索引的。我们一起来看一个例子,假定有一个职工表(employee),对于一个职工的姓和名分成两列存放(FIRST_NAME和LAST_NAME),现在要查询一个叫比尔.克林顿(Bill Cliton)的职工。   下面是一个采用联接查询的SQL语句, select * from employss where first_name||''||last_name ='Beill Cliton'; 上面这条语句完全可以查询出是否有Bill Cliton这个员工,但是这里需要注意,系统优化器对基于last_name创建的索引没有使用。   当采用下面这种SQL语句的编写,Oracle系统就可以采用基于last_name创建的索引。 *** where first_name ='Beill' and last_name ='Cliton'; . 带通配符(%)的like语句   同样以上面的例子来看这种情况。目前的需求是这样的,要求在职工表中查询名字中包含cliton的人。可以采用如下的查询SQL语句: select * from employee where last_name like '%cliton%'; 这里由于通配符(%)在搜寻词首出现,所以Oracle系统不使用last_name的索引。在很多情况下可能无法避免这种情况,但是一定要心中有底,通配符如此使用会降低查询速度。然而当通配符出现在字符串其他位置时,优化器就能利用索引。在下面的查询中索引得到了使用: select * from employee where last_name like 'c%'; 4. Order by语句   ORDER BY语句决定了Oracle如何将返回的查询结果排序。Order by语句对要排序的列没有什么特别的限制,也可以将函数加入列中(象联接或者附加等)。任何在Order by语句的非索引项或者有计算表达式都将降低查询速度。   仔细检查order by语句以找出非索引项或者表达式,它们会降低性能。解决这个问题的办法就是重写order by语句以使用索引,也可以为所使用的列建立另外一个索引,同时应绝对避免在order by子句中使用表达式。 5. NOT   我们在查询时经常在where子句使用一些逻辑表达式,如大于、小于、等于以及不等于等等,也可以使用and(与)、or(或)以及not(非)。NOT可用来对任何逻辑运算符号取反。下面是一个NOT子句的例子: ... where not (status ='VALID') 如果要使用NOT,则应在取反的短语前面加上括号,并在短语前面加上NOT运算符。NOT运算符包含在另外一个逻辑运算符中,这就是不等于()运算符。换句话说,即使不在查询where子句中显式地加入NOT词,NOT仍在运算符中,见下例: ... where status 'INVALID'; 对这个查询,可以改写为不使用NOT: select * from employee where salary3000; 虽然这两种查询的结果一样,但是第二种查询方案会比第一种查询方案更快些。第二种查询允许Oracle对salary列使用索引,而第一种查询则不能使用索引。 虽然这两种查询的结果一样,但是第二种查询方案会比第一种查询方案更快些。第二种查询允许Oracle对salary列使用索引,而第一种查询则不能使用索引。 =============================================================================================== 我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习、摘录、并汇总部分资料与大家分享! (1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. (2) WHERE子句中的连接顺序.: ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾. (3) SELECT子句中避免使用 ‘ * ‘: ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间 (4) 减少访问数据库的次数: ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等; (5) 在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200 (6) 使用DECODE函数来减少处理时间: 使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表. (7) 整合简单,无关联的数据库访问: 如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系) (8) 删除重复记录: 最高效的删除重复记录方法 ( 因为使用了ROWID)例子: DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMP_NO = E.EMP_NO); (9) 用TRUNCATE替代DELETE: 当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短. (译者按: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML) (10) 尽量多使用COMMIT: 只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少: COMMIT所释放的资源: a. 回滚段上用于恢复数据的信息. b. 被程序语句获得的锁 c. redo log buffer 中的空间 d. ORACLE为管理上述3种资源中的内部花费

2013-10-29

用第三方poi包读取excel文件

用第三方poi包读取excel文件 public class Excel { private static final Log log = LogFactory.getLog(Excel.class); String filePath; HSSFWorkbook wb; private final static SimpleDateFormat fullTimeFmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); private final static SimpleDateFormat fullDateFmt = new SimpleDateFormat("yyyy-MM-dd"); public Excel(InputStream is){ POIFSFileSystem fs; try { fs = new POIFSFileSystem(is); wb = new HSSFWorkbook(fs); } catch (FileNotFoundException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } } public Excel(){ wb = new HSSFWorkbook(); } public Excel(String filePath){ this.filePath = filePath; POIFSFileSystem fs; try { fs = new POIFSFileSystem(new FileInputStream(filePath)); wb = new HSSFWorkbook(fs); } catch (FileNotFoundException e) { throw new RuntimeException(e.getMessage()+filePath,e); } catch (IOException e) { throw new RuntimeException(e.getMessage()+filePath,e); } catch (Exception e) { throw new RuntimeException(e.getMessage()+filePath,e); } } class Point{ public Point(String cellPositionStr){ char[] chars = cellPositionStr.toCharArray(); int i = 0; for (; i < chars.length; i++) { if(Character.isDigit(chars[i])){ break; } } row = Integer.parseInt(cellPositionStr.substring(i))-1; col = cellNumStr2Int(cellPositionStr.substring(0, i)); } public Point(String colStr,int row){ col = cellNumStr2Int(colStr); this.row = row; } int row; int col; } /** * 获取sheet数目。 * @return */ public int getSheetCnt(){ return this.wb.getNumberOfSheets(); } /** * 给Excel中的某个sheet的某个单元格赋值。 * * @param cellPositionStr 位置参数如A12表示A列,12行。 * @param sheetNo * @param v * @return */ public HSSFCell setCellValue(String cellPositionStr, int sheetNo, Object v){ Point p = new Point(cellPositionStr); return setCellValue( p, sheetNo, v); } public HSSFCell setCellValue(String cellPositionStr, Object v){ Point p = new Point(cellPositionStr); return setCellValue( p, 0, v); } /** * 给Excel中的某个sheet的某个单元格赋值。 * * @param colNumStr 哪一列 * @param rowNum * @param sheetNo * @param v * @return */ public HSSFCell setCellValue(String colNumStr, int rowNum, int sheetNo, Object v){ Point p = new Point(colNumStr,rowNum); return setCellValue( p, sheetNo, v); } public HSSFCell setCellValue(Point p, int sheetNo, Object v){ return setCellValue( p.col, p.row, sheetNo, v); } /** * 给Excel中的某个sheet的某个单元格赋值。 * * @param colNum * @param rowNum 从0开始。 * @param sheetNo 从0开始。 * @param v * @return */ public HSSFCell setCellValue(int colNum, int rowNum, int sheetNo, Object v){ HSSFCell cell = this.getCell(colNum, rowNum, sheetNo); if(v == null){ cell.setCellValue(new HSSFRichTextString(""));//TODO 添加的值是以单元格格式为准,还是以数据类型为准? return cell;

2013-10-29

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除