免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: cnndj
打印 上一主题 下一主题

不知道用什么方法能作到不让JAVA的程序多次执行。 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-08-07 00:44 |只看该作者
原帖由 perryhg 于 2006-8-5 17:31 发表

用数据库可以做到多个客户端的情况下保证只有一个客户端运行,用Socket只能保证一台机器上防止重复运行。不过,socket有个好处,就是万一程序出错退出,Socket大多数情况都可以自动销毁,而文件锁定或者数据库标记就得手工清理了,否则这个程序就再也不能运行了。


放在事务中处理就不会出现问题了

论坛徽章:
0
12 [报告]
发表于 2006-08-07 21:36 |只看该作者
原帖由 ruknow 于 2006-8-7 00:44 发表


放在事务中处理就不会出现问题了

是啊,可是你得有个支持事务的容器,代码量也增加不少,如果是一个大型的系统应用,而且本来就有支持事务的应用服务器的话可以考虑这个方案,如果仅仅是一个单机的应用,就不用那么复杂了吧。

论坛徽章:
0
13 [报告]
发表于 2006-08-08 00:21 |只看该作者
原帖由 perryhg 于 2006-8-7 21:36 发表

是啊,可是你得有个支持事务的容器,代码量也增加不少,如果是一个大型的系统应用,而且本来就有支持事务的应用服务器的话可以考虑这个方案,如果仅仅是一个单机的应用,就不用那么复杂了吧。


利用数据库本身的事务管理

当然得看实际数据操作情况,不是所有情况都适用

论坛徽章:
0
14 [报告]
发表于 2006-08-08 01:14 |只看该作者
原帖由 ruknow 于 2006-8-8 00:21 发表


利用数据库本身的事务管理

当然得看实际数据操作情况,不是所有情况都适用

如果是用数据库本身的事务管理,那么当程序的一个Instance还没运行完毕的时候,这个事务还没有commit,就是说这个数据库标记对其他人是不可见的,所以程序的其他instance还是会运行,那么如何防止程序多个Instance同时运行呢?

论坛徽章:
0
15 [报告]
发表于 2006-08-08 12:01 |只看该作者
不用事务直接 lock table

怎么看都不是很好,本地的 socket 就行了吧

论坛徽章:
0
16 [报告]
发表于 2006-08-09 01:12 |只看该作者
原帖由 perryhg 于 2006-8-8 01:14 发表

如果是用数据库本身的事务管理,那么当程序的一个Instance还没运行完毕的时候,这个事务还没有commit,就是说这个数据库标记对其他人是不可见的,所以程序的其他instance还是会运行,那么如何防止程序多个Insta ...


他的问题是

是处理数据库的一个应用程序,这样开两个窗口都执行这一个test程序的话,就会出现一条数据,处理了两次


得看具体业务,如果这样的话,如果不是同时启动多个Instace,而是多次启动,总有个标记来说明数据已被处理过了。

数据库一张表做标记,启动程序时修改标记为已启动状态并commit,再处理业务,业务处理失败或完成后再恢复标记。
(不要告诉我在查表并修改提交的ms级时间启动两个Instance :)

论坛徽章:
0
17 [报告]
发表于 2006-08-09 09:44 |只看该作者
数据库一张表做标记,启动程序时修改标记为已启动状态并commit,再处理业务,业务处理失败或完成后再恢复标记。


其实也有不妥之处,跟文件还是一样

比如 “启动程序时修改标记为已启动状态并commit” 处理业务,假如失败或完成,那恢复标记什么的是没问题的

假如 “启动程序时修改标记为已启动状态并commit” 后就意外出问题呢?并没有执行意外的处理部分(程序中断)

那个标记还是依然存在

其实那就跟文件一样了,先建立锁文件,再处理,结束或有意外什么的再做处理

[ 本帖最后由 wobushiwo 于 2006-8-9 09:45 编辑 ]

论坛徽章:
0
18 [报告]
发表于 2006-08-09 10:12 |只看该作者
用数据库的好处是可以支持分布式应用的同步,用文件比较适合本机系统,用socket其实比较少见。
从扩展性来说的话数据库是个更好的解决方案。

论坛徽章:
0
19 [报告]
发表于 2006-08-10 01:04 |只看该作者
原帖由 wobushiwo 于 2006-8-9 09:44 发表


其实也有不妥之处,跟文件还是一样

比如 “启动程序时修改标记为已启动状态并commit” 处理业务,假如失败或完成,那恢复标记什么的是没问题的

假如 “启动程序时修改标记为已启动状态并commit” 后就意 ...


java里面有finally可以保证执行恢复,

如果是JVM崩溃就没说了,不过这种情况不是程序有问题一般不会出现吧

论坛徽章:
0
20 [报告]
发表于 2006-08-10 01:15 |只看该作者
原帖由 ruknow 于 2006-8-9 01:12 发表


他的问题是



得看具体业务,如果这样的话,如果不是同时启动多个Instace,而是多次启动,总有个标记来说明数据已被处理过了。

数据库一张表做标记,启动程序时修改标记为已启动状态并commit,再处理 ...

解决这样的问题只要在某个字段做个标记说明这条记录处理过了就可以了吧?用事务并不是为解决这个问题的吧。我们好像兜了一个大圈子,没准楼主就是要做这么简单的事情
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP