2009年12月13日 12:42 "itian"的内容
大致看了一下,你应该是想节省数据库操作,想自己实现一个唯一键+定时批量插入,我觉得也许你考虑得太多了,就像ban说的数据库上面弄个唯一就好了,也不需要考虑数据量到达某个数量时才插入,这会带来很多问题,你说的线程是一个,还有如果你的insertList现在size是4000,还没到达5000没有插入到数据库,服务器重启了怎么办,4000个还没插入的数据难道还要自己再实现一个持久化?对于数据库,我的领悟是,宁可执行100条简单语句,也不执行1条复杂语句

感谢回复,我不是想实现唯一键+定时批量插入,这里入库数据是用户号码信息,里面包含手机号,但是采集来的数据可能包括多个相同号码,我们要取最近的号码,因此不能简单地定为唯一键,也不能简单地在数据库上弄唯一键,这里有个业务逻辑在里面。定时批量插入是为了考虑性能才批量的。另外,这里是多线程的处理采集数据,就是怕性能上不去,服务器也不是随便重启的,因为这个服务器非常重要,就像银行服务器一样
[该贴被xysniper于2009-12-13 19:00修改过]

2009年12月12日 12:55 "xysniper"的内容

嗯,但是比如线程A调用了testDao.getUser(uservo.getMsisdn())时,得到的UserVO为空,但还没有来得急插入insertList,而此时正好线程B将此用户插入到数据库中,线程A又再将此用户插入insertList中,insertList后面再次入库不就造成重复用户号码吗?所以把addToList()用read lock住,insToDb()用write lock住

你这段思维让我困惑,本来操作List和数据库是两码事,你搞在一起,不知道你的业务边界有多宽。呵呵。

2009年12月14日 10:32 "banq"的内容
你这段思维让我困惑,本来操作List和数据库是两码事,你搞在一起,不知道你的业务边界有多宽。呵呵。

我的意思是要把查库即testDao.getUser(uservo.getMsisdn())与batchInsert()同步,否则会插入重复的号码信息,另外insertMap是共享资源,也需要同步,所以就把batchInsert()和对insertMap的操作放在一个锁内控制

2009年12月14日 10:56 "xysniper"的内容

我的意思是要把查库即testDao.getUser(uservo.getMsisdn())与batchInsert()同步,否则会插入重复的号码信息,另外insertMap是共享资源,也需要同步,所以就把batchInsert()和对insertMap的操作放在一个锁内控制

如果想将两个动作同步,放在一个加同步锁的方法内即可。readwritelock属于分散式同步锁,和方法的集中同步锁性质不一样的。所以,你不能通过readwritelock获得这个两个动作的同步,readwritelock属于资源共享式同步,而你要的是事件动作同步,因为你的事件动作操作的是两个不同数据资源,List和数据库,不是操作同一个资源,就没有资源共享一说。

数据和事件动作行为是对象的两个不同组成部分。
[该贴被banq于2009-12-14 13:59修改过]

2009年12月14日 13:57 "banq"的内容
如果想将两个动作同步,放在一个加同步锁的方法内即可。readwritelock属于分散式同步锁,和方法的集中同步锁性质不一样的。所以,你不能通过readwritelock获得这个两个动作的同步,readwritelock属于资源共享式同步,而你要的是事件动作同步,因为你的事件动作操作的是两个不同数据资源,List和数据库,不是操作同一个资源,就没有资源共享一说。数据和事件动作行为是对象的两个不同组成部分。[该贴被banq于2009-12-14 13:59修改过]

如果用readwritelock获得这个两个动作的同步,会有什么不良后果呢?

程序不能复写;复写就会关掉

程序不能复写;复写就会关掉

如果可以的话,考虑一下使用缓存。。。 List 是可以重复的。

可以考虑使用Set ..