Eclipse Database Developmentを介してDerbyに接続できますが、Hibernateを介してEclipseDatabaseDevelopmentと同じURLでDerbyを接続することはできません。
エラー:
「原因:java.sql.SQLException:Derbyの別のインスタンスがすでにデータベースを起動している可能性があります」
DerbyをDBサーバーではなく組み込みDBとして実行しているように見えます。
問題は、両方が異なるJVMで実行されており、特定のデータベースには1つのJVMからしかアクセスできないことです。
プログラムのテストを開始し、Eclipseの組み込みDBに接続できない場合、Eclipseは別のJVMを開始します。DerbyをネットワークDBサーバーとして使用する方法が役立つと思います。
数日前に、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を使用して独自のプーリングデータソースを作成しました。