我可以通过 Eclipse Database Development 连接 Derby,但我无法通过 Hibernate 将具有相同 url 的 Derby 与 Eclipse Database Development 连接。
错误:
“引起:java.sql.SQLException:另一个 Derby 实例可能已经启动了数据库”
似乎您将 Derby 作为嵌入式数据库而不是数据库服务器运行。
问题是两者都在不同的 JVM 中运行,并且只能从一个 JVM 访问给定的数据库。
当您开始测试您的程序并且不允许连接到 Eclipse 中的嵌入式数据库时,Eclipse 将启动另一个 JVM。我认为如何使用 Derby 作为网络数据库服务器可以帮助您。
几天前刚刚完成了一个使用 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 创建我自己的池化数据源。