2009-10-05 51 views
3

嗨,大家好,我可以通過Eclipse數據庫開發連接Derby,但是我無法通過Hibernate將Derby與Eclipse數據庫開發的相同URL連接起來。 錯誤:「產生的原因:java.sql.SQLException中:德比的另一個實例可能已經啓動數據庫」如何在休眠時使用Java DB(名爲Derby)

+0

答:不要!德比是一個緩慢,不靈活,功能最少的DBMS。相反,使用H2 DBMS或HSQL ...或基本上其他任何東西。 – BobMcGee 2010-03-02 14:12:01

回答

2

幾天前,剛剛完成了一個項目,使用了Derby和Hibernate。 (使用同一個JVM運行Derby)

據我所知,當你使用嵌入式驅動程序時,它默認啓動數據庫實例作爲驅動程序的一部分,只要你掛上連接數據庫運行。但對於Hibernate,它喜歡有一個DataSource給它,它應該真的是一個池數據源。

上述答案是正確的,即使您在同一個JVM中,啓動Derby作爲Network DB Server也是一個好主意。您仍然可以使用嵌入式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是DataSource實現儘可能與池DataSource包裝使用,因此連接可以被重新使用。我使用了Apache Commons DBCP,並使用EmbeddedConnectionPoolDataSource40修改了其中一個examples以創建自己的池數據源。

2

看來,如果你正在運行德比爲embedded DB,而不是一個數據庫服務器。

的問題是兩者都在 不同的JVM上運行,並給定的數據庫 只能從一個JVM訪問。

當你開始測試你的程序並且不允許在eclipse中使用嵌入數據庫時​​,Eclipse將啓動另一個JVM。我認爲how to use Derby as a network DB Server可以幫助你。

+0

另一種方法是在運行代碼之前從工具中的數據庫斷開連接 - 通過「數據源瀏覽器」視圖。 – McDowell 2009-10-05 13:25:46