原帖由 sakulagi 于 2006-8-4 20:11 发表
我理解,只能通过对本地资源加锁的方法。比如用JNI对信号量加锁。对本地磁盘文件加锁,或者占用某个特定端口。等等
原帖由 perryhg 于 2006-8-5 02:05 发表
public class MainStarter
{
private static final int port = 2323;
public static void main(String[] args)
{
try{
ServerSocket ssk = new ServerSocket(port);
...
原帖由 ruknow 于 2006-8-5 13:35 发表
数据库表做个标记
原帖由 perryhg 于 2006-8-5 17:31 发表
用数据库可以做到多个客户端的情况下保证只有一个客户端运行,用Socket只能保证一台机器上防止重复运行。不过,socket有个好处,就是万一程序出错退出,Socket大多数情况都可以自动销毁,而文件锁定或者数据库标 ...
原帖由 perryhg 于 2006-8-5 17:31 发表
用数据库可以做到多个客户端的情况下保证只有一个客户端运行,用Socket只能保证一台机器上防止重复运行。不过,socket有个好处,就是万一程序出错退出,Socket大多数情况都可以自动销毁,而文件锁定或者数据库标记就得手工清理了,否则这个程序就再也不能运行了。
原帖由 ruknow 于 2006-8-7 00:44 发表
放在事务中处理就不会出现问题了
原帖由 perryhg 于 2006-8-7 21:36 发表
是啊,可是你得有个支持事务的容器,代码量也增加不少,如果是一个大型的系统应用,而且本来就有支持事务的应用服务器的话可以考虑这个方案,如果仅仅是一个单机的应用,就不用那么复杂了吧。
原帖由 ruknow 于 2006-8-8 00:21 发表
利用数据库本身的事务管理
当然得看实际数据操作情况,不是所有情况都适用
原帖由 perryhg 于 2006-8-8 01:14 发表
如果是用数据库本身的事务管理,那么当程序的一个Instance还没运行完毕的时候,这个事务还没有commit,就是说这个数据库标记对其他人是不可见的,所以程序的其他instance还是会运行,那么如何防止程序多个Insta ...
是处理数据库的一个应用程序,这样开两个窗口都执行这一个test程序的话,就会出现一条数据,处理了两次
数据库一张表做标记,启动程序时修改标记为已启动状态并commit,再处理业务,业务处理失败或完成后再恢复标记。
原帖由 wobushiwo 于 2006-8-9 09:44 发表
其实也有不妥之处,跟文件还是一样
比如 “启动程序时修改标记为已启动状态并commit” 处理业务,假如失败或完成,那恢复标记什么的是没问题的
假如 “启动程序时修改标记为已启动状态并commit” 后就意 ...
原帖由 ruknow 于 2006-8-9 01:12 发表
他的问题是
得看具体业务,如果这样的话,如果不是同时启动多个Instace,而是多次启动,总有个标记来说明数据已被处理过了。
数据库一张表做标记,启动程序时修改标记为已启动状态并commit,再处理 ...
原帖由 ruknow 于 2006-8-10 01:04 发表
java里面有finally可以保证执行恢复,
如果是JVM崩溃就没说了,不过这种情况不是程序有问题一般不会出现吧
其实也有不妥之处,跟文件还是一样
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |