连接对象的单例实例是否在Web应用程序中产生问题

时间:2013-02-19 07:03:24

标签: java jdbc connection singleton

我正在使用下面的代码片段为Web应用程序创建一个Connection对象的单例实例,该实例将由多个用户使用。

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;
    }

除非连接关闭或为null,否则此类将返回相同的连接实例。 我想同一个连接将由不同机器上的所有用户共享,因为它是静态的。

如果一个用户将自动提交设置为关闭以将几个语句作为事务提交,这将通过限制其连接以禁用自动提交或通过在中途提交其事务(如果一个用户已使用con)来为其他用户创建问题。承诺()?

2 个答案:

答案 0 :(得分: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所说,连接池是一个更好的工具。很可能你的网络服务器已经提供了它们,如果没有,那么就有第三方库。

答案 1 :(得分:0)

  

这会通过限制其连接以禁用自动提交

来为其他用户创建问题

  如果一个用户使用了con.commit(),那么也可以在中途提交他们的交易?

数据库连接对于多个线程使用并不安全,并且通常不应该是成员字段,更不用说单例。它们应该是方法局部变量。如果你想节省创造和要毁掉它们,你必须使用连接池。