2013-02-19 23 views
1

我正在使用下面的代码片段为将由多个用户使用的Web应用程序创建连接对象的单例实例。在web应用程序中创建连接对象的单例实例

static { 
     try { 
      String driver = PropertyReader.getPropertyReader("driverClassName");   
      Class.forName(driver).newInstance(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 

    private static Connection conn = null; 
private static synchronized Connection getDBConnection() 
    { 
     try{ 
      if(conn == null || conn.isClosed()){ 
       conn = null; 
       String URL = PropertyReader.getPropertyReader("url"); 
       String userName = PropertyReader.getPropertyReader("username"); 
       String password = PropertyReader.getPropertyReader("password"); 
       conn = DriverManager.getConnection(URL,userName,password); 
       logger.info("Preparing Connection..."); 
      }    
      else{ 
       logger.info("Returning already prepared connection.."); 
      } 
     } 

     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 

     return conn; 
    } 

该类将返回连接的相同实例,直到连接关闭或为空。 我想同一个连接将被不同机器上的所有用户共享,因为它是静态的。

如果一个用户将自动提交设置为关闭以提交几个语句作为事务,这是否会为其他用户创建问题,方法是限制其连接以禁用自动提交,或者如果一个用户使用了中间方式提交其事务con.commit()?

+2

你应该更喜欢使用连接池..'Connection'只是一个JDBC接口..这取决于它是如何实现的。 – Shivam 2013-02-19 07:07:59

回答

1

是的,它会导致问题。他们都共享同一个实例,所以这种说法是错误

If one user is setting auto commit to off to commit couple of statements as transaction, will this create problems for other users by restricting their connection to disable autocommit as well or by commiting their transaction in mid way if one user has used con.commit()? 

应该由于所有的用户(线程)使用相同的实例读

If one user is setting auto commit to off to commit couple of statements as transaction, will this create problems for other users because the connection they are sharing has been set to not autocommit and all of their statements will now become part of the new transaction** 

,由一个用户给它所做的更改将影响他人。

正如Shivam Kalra所说,连接池是一个更好的工具。很可能你的网络服务器已经提供了它们,如果没有的话,还有第三方库。

+0

感谢Shivam和Sjuan。我正在考虑自己使用连接池,但在此之前,我只想确认Sjuan更好地描述的交易问题。 – Vikas 2013-02-19 09:00:07

0

将这种通过限制其连接禁用自动提交

是为其他用户创建的问题。

以及如果一个用户已经使用con.commit()提交他们的交易中途?

是的。

数据库连接对多线程不安全,一般不应该是成员字段,更不用说单身。它们应该是方法局部变量。如果您想节约创建销毁它们的&,则必须使用连接池。

相关问题