1

JSPとサーブレット(IDE:Eclipse、データベース:Oracle10)を使用してWebアプリケーションを開発しています。

を返すJavaクラスを開発しましたstatic connection。その接続は、Webアプリケーション全体で使用されます。

public class DBConnection 
{
    private static Connection con = null;

    static Connection getConnection(String str)
    {
        try
        {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            con = DriverManager.getConnection("MyValuesHere");
            System.out.println("New instance of Connection is created for: "+str);
        }
        catch(ClassNotFoundException cnfe)
        {
            System.out.println("Error loading class!");
            cnfe.printStackTrace();
        }
        catch(SQLException sqle)
        {
            System.out.println("Error connecting to the database!");
            sqle.printStackTrace();
        }
        return con;
    }//getConnection()
}//class

上記のクラスは正常に機能しています。それから私は別の4つのJavaクラスを持っています

  1. 挿入
  2. 更新
  3. 削除
  4. 選択

データベースからのデータusing the above connection。したがって、これらの4つのクラスでは、DBConnectionクラスで作成された接続を取得しており、これらの4つのクラスも正常に機能しています。この4つのクラスは、私のすべてのサーブレットで使用されています。

これらの4つのクラスで接続を取得するには、次の行を記述します。

private static Connection con = DBConnection.getConnection("UpdateQuery.java");

ただし、問題は、4つのクラスすべてで同じ接続を共有したいのですが、接続はこれらの4つのクラスで別々に作成されることです。では、これら4つのクラスで同じ接続をどのように共有する必要がありますか?これを行うためのより良い方法はありますか?このアプローチを使用すると、アプリケーション全体の接続を共有するため、Webアプリケーションに問題が発生しますか?

4

3 に答える 3

2

あなたは(暗黙のうちに)重要なタスクを解決しようとしています。

そのようなことは通常、コンテナによって行われます - プールから接続を取得し、それらを元に戻す、再接続など...

完全に機能するアプリケーション サーバーを使用する場合は、データ ソースを構成して使用することをお勧めします。

サーバーがデータ ソースをサポートしていない場合は、接続をプライベート フィールドに保存することを台無しにしないでください。たとえば、接続が失われた場合はどうなりますか? プライベート変数には、機能しない接続があります。回復メカニズムはありますか?

ビジネス オペレーションの開始時にコードを取得してから閉じると、コードはより堅牢になります。

または、接続プールをサポートする専門的に作成されたライブラリを見つけてみてください。これは、接続プールの処理において従来のコンテナとほとんど同じことを行います。

または自分で書きますが、多くの質問がある別のタスクになります。

于 2013-01-21T08:00:50.290 に答える
1

シングルトンになりたかったようですConnectionが、すでにインスタンス化されているかどうかを確認するのを忘れていました。getConnection最初に null でないかどうかを確認し、そのconインスタンスをすぐに返すことができます。conまだ null の場合にのみ、初期化を続行します。

于 2013-01-21T07:13:41.710 に答える
0

作成した接続インスタンスを のプライベートな静的フィールドに保存する必要がありますDBConnection。getConnection が呼び出されたら、フィールドが null かどうかを確認し、接続を作成してから返します。 if (connection == null) { connection = createConnection(); } return connection;

はDBConnection クラスconnectionのフィールドです。private static Connection connection

ただし、同時スレッド間で接続を共有すると深刻な問題が発生するため、このアプローチを使用しないことを強くお勧めします。接続プーリングを使用することをお勧めします

于 2013-01-21T07:13:15.393 に答える