如何在hibernate中使用Java DB(名为Derby)

时间:2009-10-05 12:41:07

标签: java jdbc derby

大家好我可以通过Eclipse数据库开发连接Derby但是我无法通过Hibernate将Derby与Eclipse Database Development的相同URL连接起来。 错误:“引起:java.sql.SQLException:Derby的另一个实例可能已经启动了数据库”

2 个答案:

答案 0 :(得分:2)

好像您将Derby作为embedded DB运行而不是数据库服务器。

  

问题是两者都在运行   不同的JVM和给定的数据库   只能从一个JVM访问。

当你开始测试你的程序并且不允许在eclipse中连接到嵌入式数据库时,Eclipse将启动另一个JVM。我认为how to use Derby as a network DB Server可以帮到你。

答案 1 :(得分:2)

刚刚完成了一个使用Derby和Hibernate完成此项目的项目,几天前。 (使用相同的JVM运行Derby。)

据我所知,当您使用嵌入式驱动程序时,它默认启动数据库实例作为驱动程序的一部分,只要您挂起连接数据库正在运行。但对于Hibernate,它喜欢给它一个DataSource,它应该是一个池化数据源。

上面的答案是正确的,将Derby作为网络数据库服务器启动真的是一个好主意,即使你在同一个JVM中也是如此。您仍然可以使用嵌入式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中的一个来创建我自己的池化DataSource。