分类: Java

一个简单的缓存框架MemCache

发表于4年前(Dec 24, 2014 2:29:11 PM)  阅读 1310  评论 0

分类: Java 类库工具 MemCache

标签: memcache 缓存框架 自动刷新

1、背景介绍:

缓存框架笔者用得不多,主要是传统行业对使用缓存的概念很薄弱,不像互联网行业那么强烈。笔者曾经用过Ehcache,Memcached,就只有这两个了,而且基本都用得很少。具笔者有限的了解,这里就不百度了,有兴趣的读者自己百度,这两个框架共同点:都支持分布式部署,都支持缓存失效,都能控制缓存大小。不同点:Ehcache支持持久化到硬盘,而Memcached就不行,只能使用内存,Ehcache集群之间数据会保持一致,挂了一台,不影响数据的丢失,而Memcached数据是分成几份存在不同集群机器上,挂了一台,那台机器上的数据就丢失了,所以互联网企业用redis比较多,能弥补Memcached的不足。Memcached主要是更轻量级,笔者上次使用Memcached是用来作为Session服务器。

缓存是一个很简单的东西,初级程序员往往会觉得很高大上,其实很多人都在实际中应用过。举个很简单的例子,项目中经常有些静态常量,我们会写个工具类来引用,其实这也可以算作缓存,缓存的作用就是将经常访问且很少改变的数据保存在内存中(或硬盘一切读取很快

......

Spring MVC使用ModelAndView进行重定向

发表于4年前(Dec 24, 2014 2:24:14 PM)  阅读 15385  评论 1

分类: Java

标签: forward ModelAndView redirect 重定向

1、Servlet重定向forward与redirect:

使用servlet重定向有两种方式,一种是forward,另一种就是redirect。forward是服务器内部重定向,客户端并不知道服务器把你当前请求重定向到哪里去了,地址栏的url与你之前访问的url保持不变。redirect则是客户端重定向,是服务器将你当前请求返回,然后给个状态标示给你,告诉你应该去重新请求另外一个url,具体表现就是地址栏的url变成了新的url。

2、ModelAndView重定向:

使用Spring MVC通常是使用ModelAndView用来返回视图。ModelAndView其实也是支持Servlet中的两种重定向方式。比如404页面我们一般采用redirect重定向方式,像下面的代码就是redirect重定向:

 

public ModelAndView getPage404MV() {		
	ModelAndVi
......

多线程任务调度工具类

发表于4年前(Dec 24, 2014 2:22:19 PM)  阅读 1199  评论 0

分类: Java 类库工具 MultiThreadJob

标签: 多线程任务调度

笔者不知道是不是已经有很多这种开源的成熟的多线程任务调度的工具,笔者也是最近才开始实践多线程编程,这个工具类也算这段学习的一点心得吧。再来说下这个工具类的作用,举个例子,网站抓图,抓图的代码很多,也很简单,网上一搜一大把,但是那些都是单线程的,使用多线程来抓图是不是会更快呢,这个当然。我们把每张图片当成一个job,每个job都是执行同一个操作,下载图片,不同的只是图片地址以及保存的文件名。在这里我们已经抽象出来了一个job,笔者最初的设想就是,我只要实现这个job,然后创建一堆job往一个任务线程池(暂时我们这么称呼它)里放,然后这些job就自动被调度执行了,听起来还不错吧。

Calendar类的getActualMaximum方法作用(获得某月份实际天数)

发表于4年前(Dec 24, 2014 2:14:56 PM)  阅读 1282  评论 0

分类: Java

标签: Calendar getActualMaximum 月份天数

首先我们看api中对getActualMaximum这个方法的说明:

Calendar (Java 2 Platform SE 6)
public int getActualMaximum(int field)

给定此 Calendar 的时间值,返回指定日历字段可能拥有的最大值。例如,在某些年份中,MONTH 字段的实际最大值是 12,而在希伯来日历系统的其他年份中,该字段的实际最大值是 13。此方法的默认实现使用了

......

SimpleDateFormat日期格式化的线程安全问题

发表于4年前(Dec 24, 2014 2:11:34 PM)  阅读 1277  评论 0

分类: Java

标签: multiple points SimpleDateFormat ThreadLocal 线程安全

写过几个java项目的人应该都熟悉SimpleDateFormat这个工具类,这是处理日期最常用的类.数据库里面对于日期的保存,常见的是直接保存日期或者是字符,这两者孰劣孰优看情况而定,还有一种少见的是直接保存秒数(这个秒数表示当前时间离1970年1月1日相差的秒数),而需求要求展示的时间格式很多,所以就经常需要转换。我们经常使用他来将日期转为字符,也用来将字符转为日期。

SimpleDateFormat使用的很多,但是笔者相信很多人不知道他是线程不安全的,好吧,笔者也是做了几年程序员以后才发现的,所以这次笔者在更新检查项目组代码的时候,立马发现了这个问题,再次得到了验证,果然是几年老程序员也会犯的错误。

Thrift序列化框架的使用

发表于4年前(Dec 24, 2014 2:08:54 PM)  阅读 1281  评论 0

分类: Java

标签: thrift 序列化

1、Thrift是什么:
Thrift是一个序列化框架,可以用来进行跨语言的服务开发,进行跨平台的RPC通信,最初由Facebook开发。 类似的产品还有google使用的protobuf,以及Kryo,据说Kryo速度更快,当然代价是摒弃了其他一些特性,如果对性能方面要求苛刻的,可以考虑研究下Kryo。

2、Thrift工作原理:
a、首先我们要开发一个Thrift服务段,绑定端口,注册接口服务。开发服务端要编写Thrift IDL文件,IDL即接口定义文件,一般包含两种形式,一种为service类型,用来对外提供接口服务,一种为struct类型,就是我们常用的java bean,用来传输对象数据。根据IDL文件生成相应平台的代码,并对接口进行实现,然后启动服务接口,等待客户端连接。
b、 复制服务端的接口定义生成的代码,也可以由对应的IDL自行生成。连接指定的服务器IP、端口,按照接口规范进行调用。

3、Thrift IDL:

......

一种文件锁的使用场景

发表于4年前(Dec 24, 2014 2:05:27 PM)  阅读 1073  评论 0

分类: Java

标签: getChannel OverlappingFileLockException RandomAccessFile

1、什么叫文件锁:
按笔者的意思理解,文件锁就是把某个文件锁定,除了当前进程能访问外,别的进程不能访问该文件。细而划分又有读锁和写锁, 读锁又名共享锁,它用来防止进程读取的文件记录被更改。文件记录可以同时设置多个读锁,但当有一个读锁存在时,就不能在该记录出设置写锁。写锁又名互斥锁,它用来保证文件更改记录时不被干扰,确保文件一致性和完整性,防止写丢失或读”脏”数据。文件记录一旦设置了写锁,就不能再设置任意锁,除非写锁释放。文件记录在同一时刻,可以设置多个读锁,单仅能设置一个写锁,并且读、写不能同时存在。

2、文件锁的使用场景:
文件锁的典型使用场景是pid文件,用于防止进程启动多个副本。只有获得 pid 文件写入权限的进程才能正常启动,并把自身的 pid 写入该文件中。常见的开源软件很多都使用文件锁,如nginx,apach,memcached等。笔者也是基于java工程的Thrift服务,想到正好可以使用文件锁来解决启动多个服务的问题。

3、文件锁的一种java实现:

......

json工具jackson使用

发表于4年前(Dec 24, 2014 2:03:57 PM)  阅读 656  评论 0

分类: Java

标签: jackson json

1、jackson是什么:
jackson 是一个 Java 用来处理 JSON 格式数据的类库,性能非常好。

2、什么时候会用到jackson:
这有点废话了,自然是处理json格式数据的时候用到。一般web应用,前台页面和后台会采用json对象用来传递数据,这时候就可以使用json;同时,接口之间传输数据也可以使用json,比起使用传统的XML的好处就不用多说了,最近使用一次jackson正是因为笔者大数据平台对外提供接口设计返回json串。接口采用thrift提供服务,thrift本身支持直接传递对象,但对实体类侵入性太大,不实用,所以笔者大部分时候都是提供json串,供其他平台自己解析。

3、我们可以用jackson来做什么:
在web应用中可以实用jackson将java对象(普通vo,集合list)转化成json串,前台页面实用js代码还原对象数据;调用第三方接口返回的数据是json串时,可以使用jackson将json串还原成java对象。

4、工具类示例:

......

安装WPS引发的excel上传问题

发表于4年前(Dec 24, 2014 1:58:56 PM)  阅读 611  评论 0

分类: Java

标签: application/kset Content-Type not allowed

一、问题场景:
前阵开发一个报表功能,功能简单描述为上传一个excel文件,读取里面已有的内容,进行一些查询操作,填充一些数据进去返回给用户下载。系统里已有类似功能,笔者使用之前的上传模块,发现文件不能上传成功,一闪即过,测试以前别人做的功能也是一样,后使用别人机器访问我机器上应用,发现有些人可以,有些人不行,跟个人机器有关。

二、问题分析:

1、首先对多台机器访问同一台应用进行测试,测试结果不一样,每台机器结果是稳定不变的,所以排除服务器配置问题(开始认为)。

2、对多个浏览器进行测试,排除浏览器兼容性问题。检查浏览器设置,未发现特别配置选项,机器或浏览器个性化配置存在可能性问题。

3、检查后台发现如下日志:
Feb 24, 2014 11:11:30 AM com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
INFO: Unable to find ‘struts.mu

......

处理大数据量报表导出

发表于4年前(Dec 24, 2014 1:58:12 PM)  阅读 1184  评论 0

分类: Java 案例

标签: poi 大数据导出

一、问题场景:

报表导出功能是很多系统常见的,java报表导出常用poi,jxl等jar包,笔者常用的是poi。使用这些开源jar包导出excel都很简单,网上随机找个例子就能用,可是一旦碰到导出的数据量很大的时候就出问题了。项目中有个报表导出功能,如果不选条件,可以将所有数据进行导出,现有数据量有20w,客户不愿分批导出,导出过程中经常报错,无法正常完成,笔者接手处理该问题。

二、问题分析:

1、查看代码,所有数据直接从数据库load进来,组成java实体,在开发库测试,开发库上只有3w多数据,就已经报内存溢出了,这是一个问题。

2、解决完这个问题后使用poi进行excel写入操作时,同样会报内存溢出,这时使用的是poi3.7,用的HSSFWorkbook。

3、excel本身有限制2003 是65536行,2007是1048576行。

三、解决问题:

1、首先所有数据load到内存中的做法肯定是不对的,内存再大总有限制,数据量一直在增长,

......