2009-10-05 54 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