我曾使用singleton模式取得单一的Connection,用统一的数据管理类对数据进行集中管理,这样可以只使用同一个Connection,并且大幅减少传递Connection对象的次数。不知是否有更好的办法,仅以此抛砖引玉。
并up。

解决方案 »

  1.   

    Connection conn = ...........
    A a = new A(conn);
    B b = new B(conn);
      

  2.   

    只能用蠢的方法吧
    不应该说蠢的,commit两次,rollback两次咯,我都是这样的了
      

  3.   

    stonefeng(浩) :
    这个问题一直困扰了我很久,比如我做了一些数据库操作,同时要再做登记簿,其实只要调用别的对象一个方法就可以了.但是这样就保证不了这两步操作用同一个事务。我只能这样解决:不怕麻烦,再重新些sql完成操作,从耳很容易保证了事务。你用'singleton模式取得单一的Connection',能不能解决B/S架构多用户问题?
      

  4.   

    我用singleton模式取得单一Connection的前提是:实现该模式的类需要在服务器端运行,而B/S结构中的多用户与服务器交互的代码其实都在服务器端运行,singleton正好与B/S结构相吻合,是解决B/S构架中取得单一对象的好方法。我的思想与EJB的某些思想一致。
    我通常使用如下做法:
    假如要管理order和orderDetail两种对象
    先创建Order和OrderDetail两个类,只包含这两个类的信息,与数据库无关。类似EJB中的实体Bean。
    再创建OrderManager类,管理Order、OrderDetail类的对象与数据库的联系。类似EJB中的事务Bean。
    这样就可以把所有事务完全封装在OrderManager中了。
      

  5.   

    在weblogic中使用ejb的时候,要做到这个很容易,因为weblogic本身就支持这种。
      

  6.   

    to stonefeng(浩) :我还是有个疑问,如果多个用户(也就是Session)都用同一个连接的话,这样是不正确的,会造成并发操作冲突问题.其实应该是每个用户(Session)应该只能有一个实例,多个用户(session)应该用不同的实例.我想把我的问题修正为:在B/S架构中,怎样保证每个用户(也就是每次会话生命周期内)只能得到一个类的单独的实例,而不同的用户应该得到这个类不同的实例.谢谢!
      

  7.   

    当然,如果使用EJB的话,就如楼上所讲。
    但我指的是不用EJB的情况下的做法。
      

  8.   

    NullGate(我爱小白) :使用Singleton模式的时候,可以变通一下,使每个用户都能取且仅能取一个Connection,再将Connection存入Session。这样就可以满足你的要求。但其实这种方法有问题。在用户太多的时候,每个用户都取一个Connection不但速度慢,而且Connection太多服务器负担也大大增加。可以再将Singleton变通一下,变成一个连接池,回收和再利用Connection。
    问题就解决了。
      

  9.   

    stonefeng(浩):
    怎么变通?当然我不会把Connection放到session中去,而是在一个用户的生命周期内,都只能有一个实例,不用的时候放回池中,用的时候再去拿(但每个用户最多只能拿一个)
    正如你所说的,我用的也是连接池
      

  10.   

    stonefeng(浩) 假设有一个用户,用到两个对象:A,B
    而A,B都需要操作数据库,我怎样去保证A和B从连接池里拿到的是同一个连接别的用户,要用到一个对象:C
    而C也需要操作数据库,怎样去保证C和(A,B)用的不是同一个连接
      

  11.   

    在对象的构造里传入一个连接,然后在这个对象里操作数据时就用传进去的连接,这样只要保证传给每个对象的连接是同一个,就可以实现多个对象在同一个事务里。正如:
    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里这是样用的。所以我也这样用了。 但我感觉还是不舒服
      

  12.   

    要能给每个用户建立一个标识符就好了
    就像app server现实的那样,给每个用户分配一个标识符
      

  13.   

    truezerg(赵明宇):
    我认为你的方法可行,我也想到过。
    但是又产生搂主所提的问题里了,和你一样,总觉得不很完美。NullGate(我爱小白):
    在我的方法中,A和B是不需要亲自操作数据库的,而是由另外一个类来完成,如我前面所述的OrderManager,只需要将Connection传给OrderManager即可。
      

  14.   

    每个Session应该有一个唯一的ID,可以用来表示用户。
      

  15.   

    A,B对象操作数据库
    C 负责连接数据库,获取连接
    当A需要连接的时候,从C拿出一个Connection来,并且做一个标志
    当B也需要连接的时候,就会先判断C刚才那个标志,
    这样的话可以做到多个对象保持事务