情况是这样的。
有多个客户端同时连接数据库服务器。
客户端是用java写的,数据库是Oracle,客户端直接连接Oracle。
某个表里,存放的是一些事件,要求每个事件只能由一个客户端处理,请问如何实现。
如何避免两个客户端同时处理一条记录(一个事件)
我担心在取的过程中,两个同时取。
大家说说有什么好办法解决。???
项目中需要用到,特别紧急,感谢大侠的帮助了。
8 个解决方案
#1
我刚学j2se 线程同步里有锁定的 Synchronized
#2
事务隔离
悲观锁:
select * from t where t.id = 'xx' for update;
update ....
commit;
或 乐观锁,给表增加一个"版本"字段,每次对该行执行更新后要赋予"版本"新的值
悲观锁:
select * from t where t.id = 'xx' for update;
update ....
commit;
或 乐观锁,给表增加一个"版本"字段,每次对该行执行更新后要赋予"版本"新的值
#3
对于多客户端2楼的方式是不行的,因为不再同一机器上运行。
3楼的方式是一个解决办法,利用数据库事务机制实现同步机制。
3楼的方式是一个解决办法,利用数据库事务机制实现同步机制。
#4
“有多个客户端同时连接数据库服务器。
客户端是用java写的,数据库是Oracle,客户端直接连接Oracle。
某个表里,存放的是一些事件,要求每个事件只能由一个客户端处理,请问如何实现。”
这个问题需要根据情况分析:
第一,如果客户端的操作都只包含一条sql语句的话,那么,不必做任何事情,因为数据库本身有并发控制的功能,它会自动处理,不需要客户操心的。
第二,如果如果客户端的操作都要包含多条语句的话,那么,把这些语句放到一个synchronized块中(或者synchronized函数)中就可以了。
客户端是用java写的,数据库是Oracle,客户端直接连接Oracle。
某个表里,存放的是一些事件,要求每个事件只能由一个客户端处理,请问如何实现。”
这个问题需要根据情况分析:
第一,如果客户端的操作都只包含一条sql语句的话,那么,不必做任何事情,因为数据库本身有并发控制的功能,它会自动处理,不需要客户操心的。
第二,如果如果客户端的操作都要包含多条语句的话,那么,把这些语句放到一个synchronized块中(或者synchronized函数)中就可以了。
#5
如果多个客户端都通过web访问数据库,那是没有问题的,因为jsp技术中,所有的访问实际上都是在一台计算机上即服务器上执行的。
如果所有客户端不是通过web,而是直接连接数据库,那确实2楼的做法行不通。
#6
我们做的项目就是这么干的 因为我们的是c/s模式的 也就是多个客户端~~~
#7
采用数据库的事务管理机制
#8
谢谢大家的回复。
我现在采取了另外一种方式,就是服务器端创建了一个web service,然后在server端采用同步模块的取数据,分发给客户端。
至于悲观锁,我觉得不是很可取,因为万一某个客户端断线了,就会hold住整个数据库。
对于乐观锁,我曾采用了hibernate @version来指定,然后用spring管理事物,但是我模拟了多线程访问,发现getVersion返回的都是一样的,没有冲突。
所以想来想去,还是创建web service吧。简单起见,不采用Axis2,采用了CXF,巨方便。
我现在采取了另外一种方式,就是服务器端创建了一个web service,然后在server端采用同步模块的取数据,分发给客户端。
至于悲观锁,我觉得不是很可取,因为万一某个客户端断线了,就会hold住整个数据库。
对于乐观锁,我曾采用了hibernate @version来指定,然后用spring管理事物,但是我模拟了多线程访问,发现getVersion返回的都是一样的,没有冲突。
所以想来想去,还是创建web service吧。简单起见,不采用Axis2,采用了CXF,巨方便。
#1
我刚学j2se 线程同步里有锁定的 Synchronized
#2
事务隔离
悲观锁:
select * from t where t.id = 'xx' for update;
update ....
commit;
或 乐观锁,给表增加一个"版本"字段,每次对该行执行更新后要赋予"版本"新的值
悲观锁:
select * from t where t.id = 'xx' for update;
update ....
commit;
或 乐观锁,给表增加一个"版本"字段,每次对该行执行更新后要赋予"版本"新的值
#3
对于多客户端2楼的方式是不行的,因为不再同一机器上运行。
3楼的方式是一个解决办法,利用数据库事务机制实现同步机制。
3楼的方式是一个解决办法,利用数据库事务机制实现同步机制。
#4
“有多个客户端同时连接数据库服务器。
客户端是用java写的,数据库是Oracle,客户端直接连接Oracle。
某个表里,存放的是一些事件,要求每个事件只能由一个客户端处理,请问如何实现。”
这个问题需要根据情况分析:
第一,如果客户端的操作都只包含一条sql语句的话,那么,不必做任何事情,因为数据库本身有并发控制的功能,它会自动处理,不需要客户操心的。
第二,如果如果客户端的操作都要包含多条语句的话,那么,把这些语句放到一个synchronized块中(或者synchronized函数)中就可以了。
客户端是用java写的,数据库是Oracle,客户端直接连接Oracle。
某个表里,存放的是一些事件,要求每个事件只能由一个客户端处理,请问如何实现。”
这个问题需要根据情况分析:
第一,如果客户端的操作都只包含一条sql语句的话,那么,不必做任何事情,因为数据库本身有并发控制的功能,它会自动处理,不需要客户操心的。
第二,如果如果客户端的操作都要包含多条语句的话,那么,把这些语句放到一个synchronized块中(或者synchronized函数)中就可以了。
#5
如果多个客户端都通过web访问数据库,那是没有问题的,因为jsp技术中,所有的访问实际上都是在一台计算机上即服务器上执行的。
如果所有客户端不是通过web,而是直接连接数据库,那确实2楼的做法行不通。
#6
我们做的项目就是这么干的 因为我们的是c/s模式的 也就是多个客户端~~~
#7
采用数据库的事务管理机制
#8
谢谢大家的回复。
我现在采取了另外一种方式,就是服务器端创建了一个web service,然后在server端采用同步模块的取数据,分发给客户端。
至于悲观锁,我觉得不是很可取,因为万一某个客户端断线了,就会hold住整个数据库。
对于乐观锁,我曾采用了hibernate @version来指定,然后用spring管理事物,但是我模拟了多线程访问,发现getVersion返回的都是一样的,没有冲突。
所以想来想去,还是创建web service吧。简单起见,不采用Axis2,采用了CXF,巨方便。
我现在采取了另外一种方式,就是服务器端创建了一个web service,然后在server端采用同步模块的取数据,分发给客户端。
至于悲观锁,我觉得不是很可取,因为万一某个客户端断线了,就会hold住整个数据库。
对于乐观锁,我曾采用了hibernate @version来指定,然后用spring管理事物,但是我模拟了多线程访问,发现getVersion返回的都是一样的,没有冲突。
所以想来想去,还是创建web service吧。简单起见,不采用Axis2,采用了CXF,巨方便。