我需要在Servlet中产生流水号

怎样才能保证高效而且安全呢?流水号是不能重复并且Long型递增的,由多个Servlet共同使用。这里涉及到并发访问和在哪一部分实现的问题,大家有什么好的主意,帮忙出出。

放在SerletContext中,或者写一个SessinoListener之类的对象

用singlton模式根据当前最大ID产生下一个ID,并用该ID更新当前最大ID(注意方法同步),
问题是这个最大ID放在哪和怎么存取才会即安全又准确且高效!
可以考虑在数据库中开张表,就记当前最大ID,如果数据库访问层设计的好效率还是可以的(可以参考很多系统中数据库访问层的sequnance做法)

一点想法而已:)呵呵

数据库!

I_walker;

Oracle数据库中的Sequence的实现好象就是类似这样的,不过它好象是每次按照一个步长产生一组序列号放到Cache里,然后每次去取,取到最大再产生一次。我在Servlet中当然也可以采用类似的方法放DB中,问题是这样做Web层与数据库的交互还是比较频繁,实现也稍显麻烦一些。

我也想过用ServletContext中实现,但是这样的话我怎样记录我的当前流水号,在AppServer重启以后接着从上次的流水开始呢?也就是我怎样在系统Shutdown时把流水号序列化到某处,然后restart时再读入Context中?

可以参考jive中的SequenceManager,它的实现与楼上各位的想法一致。