软件开发

高性能JavaBean属性复制工具BeanUtils的实现

2011-06-25, Posted in Java | 我来说两句 | 查看全文>>

JavaBean属性复制较好的工具有apache提供的Jakarta-Common-BeanUtils,不过他的性能不太近人意,我测试的一个JavaBean共有16个属性,使用Jakarta-Common-BeanUtils与直接使用get/set方法相比,差开800倍!如果是企业内部应用800倍的差别可能影响也没有多大,但如果你做是一个高性能的服务器800倍就是很大的问题.当然,Jakarta-Common-BeanUtils还有一个问题,就是你的项目中必须引入commons-beanutils-x.x.x.jar及等等相关的包,这个我很不喜欢!

不喜欢它,又想要它的功能,那就自己写一个简单的,这样还自主!当然实现这样的JavaBean属性复制工具,必须要满足两个要求才有意义,第一是比它要轻量,甚至一个类就要解决它,第二个性能一定要比它好,这是最关键的.

实现这样的JavaBean属性复制工具,肯定要乃至java的反射. 查看全文…

标签: , ,

扩展Jpanel来实现Swing组件的背景图片设置功能

2011-06-23, Posted in Java | 我来说两句 | 查看全文>>

Swing组件好像只提供了设置背景颜色的功能,没有直接设置图片的方法,我记得在iphone的编程中是很方便可以设置图片与颜色的,而最近的项目中,可能需要到这个功能,那就先实现一个吧.

这个扩展类扩展了Jpanel,并提供了一个public void setBackground(String wallpaper) 方法来设置背景图片.然后调用repaint()方法去重绘控件,达到设置背景图片的目的.具体的代码如下: 查看全文…

标签: ,

Java版本的任务引擎(定时调度器)

2011-05-31, Posted in Java | 4 回复 | 查看全文>>

java的任务引擎(定时调度器)比较多,可以直接使用Timer与TimerTask来写一个,也可以使用Quartz这样的成熟组件.我是一个代码洁癖者,如果在代码中零散的使用Timer与TimerTask我会很难受,同时我也不喜欢引用太多的第三方jar包,因为那样看起来项目会很臃肿,也或会出现无法控制的情况!所以当我需要一个任务引擎(定时调度器),我没有使用成熟的Quartz,而是对Timer与TimerTask做了一个轻量的封装.

在我的想法里,任务引擎至少应该有如下功能:

  • 线程可控
  • 在线程池中可以快速执行一个任务
  • 可以固定延时执行循环执行任务
  • 以固定速率执行循环执行任务
  • 可以方便取消任何任务

基于上面的想法,Java版本的任务引擎可以简单的封装成如下: 查看全文…

标签:

用生产消费者模式实现数据队列定时或定量的异步存储

2011-03-06, Posted in Java, 一起分享 | 1 回复 | 查看全文>>

需求:
最近在考虑IM软件服务器端编程,有这样一个需求,就是把用户发的信息,全部保存到数据库中,如果是一般的web应用,可能就直接把用户提交的数据写入数据库了,但IM的信息的特点时,需要响应快(实时处理),数据量大,根据这个特点,我设计成接收转发模块与数据写入数据库为不同的模块,很明显,他们满足生产消费者模式,即某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者。生产者与消费者并没有构成生产消费者模式,而生产者生产的数据由消费者消费的过程才能构成生产消费者模式。

设计:
生产者和消费者模式实现方式很多,但在实现的时候我们至少需要考虑生产消费解耦、支持并发、支持生产消费忙闲不均的情况。
一、解耦
  假设生产者和消费者分别是两个类。如果让生产者直接调用消费者的某个方法,那么生产者对于消费者就会产生依赖(也就是耦合)。将来如果消费者的代码发生变化,可能会影响到生产者。而如果两者都依赖于某个缓冲区,两者之间不直接依赖,耦合也就相应降低了。这个缓冲区我们可以用一个列队实现。
  
二、支持并发(concurrency)
  生产者直接调用消费者的某个方法,还有另一个弊端。由于函数调用是同步的(或者叫阻塞的),在消费者的方法没有返回之前,生产者只好一直等在那边。万一消费者处理数据很慢,生产者就会白白糟蹋大好时光。
  使用了生产者/消费者模式之后,生产者和消费者可以是两个独立的并发主体。生产者把制造出来的数据往缓冲区一丢,就可以再去生产下一个数据。基本上不用依赖消费者的处理速度。其实当初这个模式,主要就是用来处理并发问题的。这样高并发下,用户感觉响应很快:)
  
三、支持忙闲不均
  缓冲区还有另一个好处。如果制造数据的速度时快时慢,缓冲区的好处就体现出来了。当数据制造快的时候,消费者来不及处理,未处理的数据可以暂时存在缓冲区中。等生产者的制造速度慢下来,消费者再慢慢处理掉。

除了以上三个需要考虑的,在我的项目中,我还要考虑与数据库的交互不能太频繁,只能满足一定数据量时,使用批量方式写入数据库(定量写入),这个实现本身很简单,但如果考虑到服务器清闲时,很长时间都达不到这个数据量,但这段时间内可能会停机,没有写入数据库的数据就可能丢失,所以在给定的一段时间里,数据量没有到达给定数据的条件,只要达到时间条件,也需要写入数据库。

实现:
基于以上的想法,我们可以使用java.util.concurrent.BlockingQueue来实现,这里仅分析一些关键代码 查看全文…

标签: ,

锁定SVN中的二进制文件防止冲突

2010-12-15, Posted in 一起分享, 常用, 软件开发, 配置 | 我来说两句 | 查看全文>>

在SVN中对于二进制文件,或者不太适合合并的文件进行修改时,直接使用默认的”拷贝-修改-合并”工作模式可能造成很多不方便,如出现冲突,可能会无法合并等等,费时费力!这样的情况还是使用VSS“锁定-编辑-解锁”的工作模式比较好。SVN同样支持这种工作方式,但网上的文章对于这种工作模式介绍比较少,基本出于同一文章,而且对这种工作模式的具体使用没有介绍,这文章就是介绍你怎么在SVN中使用”锁定-编辑-解锁”工作模式。

SVN中使用”锁定-编辑-解锁”工作模式的原理很简单,主要通过内置的属性“svn:needs-lock”实现“锁定-编辑-解锁”模型,注意,这个属性只对独立文件有效,对目录不起作用。我以Eclipse为例子,说一下他的使用:

1、设置文件的工作模式为“锁定-编辑-解锁”

选择需要设置为“锁定-编辑-解锁”模式的文件—》点击右键—》Team —》设置属性,出现如下对话框

svn set property

svn set property

然后提交到svn服务器,提交后,原来的文件小图标会出来一个红圈包含的减号。说明工作模式已经设置成功!设置好第一步后,所有更新到最新版本的客户端文件,都会出现同样的标记,设置成功后,这个文件被设置为只读模式,在没有取得锁定前,将不可以直接修改保存。

2、锁定文件
在修改文件前,我们需要首先锁定文件才能修改,锁定后,其它人就不能再锁定了。直到锁定人员提交本次修改,或者手工解除锁定,锁定文件过程如下: 查看全文…

标签: , ,