1

以下のコードスニペットを使用して、複数のユーザーが使用する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になるまで、同じ接続インスタンスを返します。静的な接続であるため、同じ接続が異なるマシン上のすべてのユーザーによって共有されると思います。

1人のユーザーが自動コミットをオフに設定していくつかのステートメントをトランザクションとしてコミットする場合、接続を制限して自動コミットも無効にするか、1人のユーザーがcon.commit( )?

4

2 に答える 2

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**

すべてのユーザー(スレッド)が同じインスタンスを使用しているため、1人のユーザーがインスタンスに加えた変更は、他のユーザーに影響します。

Shivam Kalraが言うように、接続プールはより優れたツールです。ほとんどの場合、Webサーバーはすでにそれらを提供しており、そうでない場合はサードパーティのライブラリがあります。

于 2013-02-19T07:21:30.500 に答える
0

これにより、接続を制限して自動コミットを無効にすることにより、他のユーザーに問題が発生しますか

はい。

同様に、または1人のユーザーがcon.commit()を使用した場合、途中でトランザクションをコミットすることによって?

はい。

データベース接続は、複数のスレッドでの使用には安全ではなく、一般に、シングルトンはもちろんのこと、メンバーフィールドであってはなりません。それらはメソッドローカル変数である必要があります。それらの作成と破棄を節約したい場合は、接続プールを使用する必要があります。

于 2013-02-19T22:32:00.967 に答える