0

シングルトン データベース接続を使用する Java EE Struts Web アプリケーションがあります。以前は weblogic サーバーが 1 つしかありませんでしたが、現在はクラスター内に 2 つの weblogic サーバーがあります。

セッション レプリケーションは、このクラスターで動作することがテストされています。Web アプリケーションは、ユーザーが入力するさまざまなフォームを開くいくつかのリンクで構成されています。各フォームには、クリックされたフォームに応じていくつかの値を入力する動的なドロップダウン リストがあります。これらのドロップダウンリストの値は、Oracle データベースから取得されます。

固有の問題の 1 つは、最初にクリックされたフォームが約 2 ~ 5 秒かかり、2 番目にクリックされたフォームの読み込みに 5 分以上かかる場合があることです。コードを確認したところ、db 接続の 1 つのインスタンスを呼び出そうとすると問題が発生することがわかりました。これはデッドロックになる可能性がありますか?

public static synchronized DataSingleton getDataSingleton()
throws ApplicationException {
        if (myDataSingleton == null) {
            myDataSingleton = new DataSingleton();
        }
        return myDataSingleton;
    }

このようなシナリオを説明するための助けをいただければ幸いです。

ありがとうございました

A sample read operation calling Singleton 

String sql = "...";
DataSingleton myDataSingleton = DataSingleton.getDataSingleton();
conn = myDataSingleton.getConnection();

        try {

            PreparedStatement pstmt = conn.prepareStatement(sql);

            try {
                pstmt.setString(1, userId);
                ResultSet rs = pstmt.executeQuery();

                try {
                    while (rs.next()) {
                        String group = rs.getString("mygroup");
                    }

                } catch (SQLException rsEx) {
                    throw rsEx;

                } finally {
                    rs.close();
                }
            } catch (SQLException psEx) {
                throw psEx;

            } finally {
                pstmt.close();
            }
        } catch (SQLException connEx) {
            throw connEx;

        } finally {
            conn.close();
        }



 The Singleton class
 /**
 * Private Constructor looking up for Server's Datasource through JNDI
 */
private DataSingleton() throws ApplicationException {
    try {
        Context ctx = new InitialContext();
        SystemConstant mySystemConstant = SystemConstant
                .getSystemConstant();

        String fullJndiPath = mySystemConstant.getFullJndiPath();
        ds = (DataSource) ctx.lookup(fullJndiPath);

    } catch (NamingException ne) {
        throw new ApplicationException(ne);
    }
}

/**
 * Singleton: To obtain only 1 instance throughout the system
 * 
 * @return DataSingleton
 */
public static synchronized DataSingleton getDataSingleton()
        throws ApplicationException {
    if (myDataSingleton == null) {
        myDataSingleton = new DataSingleton();
    }

    return myDataSingleton;
}

/**
 * Fetching SQL Connection through Datasource
 * 
 */
public Connection getConnection() throws ApplicationException {
    Connection conn = null;
    try {

        if (ds == null) {
        }

        conn = ds.getConnection();

      } catch (SQLException sqlE) {
        throw new ApplicationException(sqlE);
    }
    return conn;
}
4

1 に答える 1

0

接続の使用の最後にトランザクションをコミットしていないようです。

DataSingleton の内容 - データベース接続ですか? 複数のスレッドが同じデータベース接続にアクセスできるようにすることは、たとえば複数のユーザーがいる場合などには機能しません。DataSource などのデータベース接続プールを使用しないのはなぜですか?

于 2012-07-05T10:19:05.387 に答える