2

Eclipse Database Developmentを介してDerbyに接続できますが、Hibernateを介してEclipseDatabaseDevelopmentと同じURLでDerbyを接続することはできません。

エラー:

「原因:java.sql.SQLException:Derbyの別のインスタンスがすでにデータベースを起動している可能性があります」

4

2 に答える 2

2

DerbyをDBサーバーではなく組み込みDBとして実行しているように見えます。

問題は、両方が異なるJVMで実行されており、特定のデータベースには1つのJVMからしかアクセスできないことです。

プログラムのテストを開始し、Eclipseの組み込みDBに接続できない場合、Eclipseは別のJVMを開始します。DerbyをネットワークDBサーバーとして使用する方法が役立つと思います。

于 2009-10-05T13:17:42.883 に答える
2

数日前に、DerbyとHibernateを使用して、これを行うプロジェクトを終了しました。(Derbyが同じJVMで実行されている場合。)

私が理解しているように、Embeddedドライバーを使用すると、デフォルトで、ドライバーの一部としてデータベースインスタンスが起動し、データベースが実行されている接続に接続している限り起動します。しかし、Hibernateの場合、DataSource実際にはプーリングデータソースである必要があります。

上記の答えは正解です。同じJVMを使用している場合でも、DerbyをネットワークDBサーバーとして起動することをお勧めします。接続先のデータベースがネットワークモードになっていることを認識し、それに応じて調整する組み込みJDBCドライバーを引き続き使用できます。(これにより、サードパーティのツールを使用してデータベースに接続し、実行中にデータとスキーマを表示および編集できるため、デバッグに非常に便利です。)

System.setProperty("derby.system.home", applicationHome);

NetworkServerControl serverControl = new NetworkServerControl(InetAddress.getByName(m_address),port);

serverControl.start(new PrintWriter(System.out, true)); 

データベースが実行されたら、DataSourceインスタンスをJNDIレジストリに固定します。次に、Hibernateは、名前を指定して、JNDIレジストリからこのデータソースにアクセスできます。

EmbeddedConnectionPoolDataSource40 dataSource = new EmbeddedConnectionPoolDataSource40();
dataSource.setDatabaseName(databaseName);
dataSource.setUser(username);
dataSource.setPassword(password);

これEmbeddedConnectionPoolDataSource40は、プール化データソースラッパーで使用するデータソース実装であり、可能な場合は接続を再利用できます。Apache Commons DBCPを使用し、の1つを変更して、EmbeddedConnectionPoolDataSource40を使用して独自のプーリングデータソースを作成しました。

于 2009-10-05T21:17:10.833 に答える