to stonefeng(浩) :我还是有个疑问,如果多个用户(也就是Session)都用同一个连接的话,这样是不正确的,会造成并发操作冲突问题.其实应该是每个用户(Session)应该只能有一个实例,多个用户(session)应该用不同的实例.我想把我的问题修正为:在B/S架构中,怎样保证每个用户(也就是每次会话生命周期内)只能得到一个类的单独的实例,而不同的用户应该得到这个类不同的实例.谢谢!
在对象的构造里传入一个连接,然后在这个对象里操作数据时就用传进去的连接,这样只要保证传给每个对象的连接是同一个,就可以实现多个对象在同一个事务里。正如: Connection conn = ........... A a = new A(conn); B b = new B(conn);还有一种方法是把连接传给类的方法。如: Connection conn=........ A a=new A(); B b=new B(); 事务开始 a.insert(conn); b.update(conn); 事务结束 我也遇到这样的问题,也想了不少办法。我看jive里这是样用的。所以我也这样用了。 但我感觉还是不舒服
A a = new A(conn);
B b = new B(conn);
不应该说蠢的,commit两次,rollback两次咯,我都是这样的了
这个问题一直困扰了我很久,比如我做了一些数据库操作,同时要再做登记簿,其实只要调用别的对象一个方法就可以了.但是这样就保证不了这两步操作用同一个事务。我只能这样解决:不怕麻烦,再重新些sql完成操作,从耳很容易保证了事务。你用'singleton模式取得单一的Connection',能不能解决B/S架构多用户问题?
我通常使用如下做法:
假如要管理order和orderDetail两种对象
先创建Order和OrderDetail两个类,只包含这两个类的信息,与数据库无关。类似EJB中的实体Bean。
再创建OrderManager类,管理Order、OrderDetail类的对象与数据库的联系。类似EJB中的事务Bean。
这样就可以把所有事务完全封装在OrderManager中了。
但我指的是不用EJB的情况下的做法。
问题就解决了。
怎么变通?当然我不会把Connection放到session中去,而是在一个用户的生命周期内,都只能有一个实例,不用的时候放回池中,用的时候再去拿(但每个用户最多只能拿一个)
正如你所说的,我用的也是连接池
而A,B都需要操作数据库,我怎样去保证A和B从连接池里拿到的是同一个连接别的用户,要用到一个对象:C
而C也需要操作数据库,怎样去保证C和(A,B)用的不是同一个连接
Connection conn = ...........
A a = new A(conn);
B b = new B(conn);还有一种方法是把连接传给类的方法。如:
Connection conn=........
A a=new A();
B b=new B();
事务开始
a.insert(conn);
b.update(conn);
事务结束
我也遇到这样的问题,也想了不少办法。我看jive里这是样用的。所以我也这样用了。 但我感觉还是不舒服
就像app server现实的那样,给每个用户分配一个标识符
我认为你的方法可行,我也想到过。
但是又产生搂主所提的问题里了,和你一样,总觉得不很完美。NullGate(我爱小白):
在我的方法中,A和B是不需要亲自操作数据库的,而是由另外一个类来完成,如我前面所述的OrderManager,只需要将Connection传给OrderManager即可。
C 负责连接数据库,获取连接
当A需要连接的时候,从C拿出一个Connection来,并且做一个标志
当B也需要连接的时候,就会先判断C刚才那个标志,
这样的话可以做到多个对象保持事务