0

データベースとしてJavaDB(つまり、Apache Derby)を使用するJavaアプリケーションを作成しています。次の方法を使用してデータベースに接続します。

Connection getConnection() throws SQLException {

        EmbeddedDataSource  ds =  new EmbeddedDataSource();
        ds.setDatabaseName(dbUri);
        ds.setPassword(password);
        ds.setUser(username);

        Connection conn = ds.getConnection();               
        conn.setSchema(schema); 

        return conn;            
    }

これは問題なく動作しますが、次の例外が発生することがあります。

java.sql.SQLException: Another instance of Derby may have already booted the database

これは、アプリケーションを実行し、同時にSQuirreLSQLクライアントがデータベースに接続されている場合に発生します。したがって、すべてが期待どおりに機能しますが、私のメソッドでこれを確認できるようにしたいと思いgetConnection()ます。つまり、データベースに対して開かれているセッションがあるかどうかを確認し、たとえば、セッションを閉じたり、独自の例外をスローしたり、エラーダイアログボックスを表示したりしたいと思います。これを行う方法がわかりません。

どうも

4

3 に答える 3

0

アプリケーションが「SQLExceptionをスローする」と宣言するのではなく、「try」ブロックを使用してSQLExceptionをキャッチし、例外を調べて、それが「Derbyの別のインスタンス」例外であるかどうかを判断できます。

次に、それに応じて「getConnection」メソッドから独自の例外をスローできます。

于 2013-02-04T19:47:22.957 に答える
0

getConnection()メソッドを次のように変更しました。それは私が望むことをします:

  Connection getConnection() throws SQLException, DAOConnection {

        EmbeddedDataSource  ds =  new EmbeddedDataSource();
        ds.setDatabaseName(dbUri);
        ds.setPassword(password);
        ds.setUser(username);

        Connection conn = null;

        try {
            conn = ds.getConnection();
        } catch (SQLException e) {          

            // check if cannot connect due to "Another instance of 
                    // Derby may have already booted the database".
                    // The error code of this exception is 45000.

            if (e.getNextException().getErrorCode() ==  45000) {
                throw new DAOConnection(e.getNextException().getMessage());
            } 

            throw new SQLException(e);
        }

        conn.setSchema(schema);                         
        return conn;            
    }
于 2013-02-05T02:23:30.143 に答える
0

治療よりも予防​​が大切です。IMO、例外をキャッチし、それが重複していることに気付くと、Derbyサーバーが起動しました。これは理想的な設計ではありません。重複するインスタンス化を防ぐことをお勧めします。可能であれば、メソッドを同期するか、シングルトンクラスgetConnection()の一部にするか、JVMによって1回だけロードされるスタートアップ/メインクラスの静的初期化ブロックから組み込みDerbyドライバーをロードすることができます。したがって、Derbyは1回だけ起動されます。main / startupクラスをフォローするようなもので、うまくいくはずです。

static {
   try {
        Class.forName("org.apache.derby.jdbc.EmbeddedDriver"); 
   }
   catch(Exception e){
    .....
   }
}

こちらのリンクhttp://db.apache.org/derby/docs/10.3/devguide/tdevdvlp38381.htmlドライバーをロードすると、Derby組み込みシステムが起動します。

于 2013-02-12T02:33:28.220 に答える