【问题标题】:How to use Java DB (named Derby) with hibernate? [closed]java - 如何在休眠中使用Java DB(名为Derby)? [关闭]
【发布时间】:2010-12-03 22:33:27
【问题描述】:

我可以通过 Eclipse Database Development 连接 Derby,但我无法通过 Hibernate 连接具有与 Eclipse Database Development 相同 url 的 Derby。

错误:

“原因:java.sql.SQLException:另一个 Derby 实例可能已经启动了数据库”

【问题讨论】:

  • 回答:不要! Derby 是一个缓慢、不灵活、功能最少的 DBMS。改用 H2 DBMS 或 HSQL... 或其他任何东西。

标签: java jdbc derby


【解决方案1】:

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

据我了解,当您使用嵌入式驱动程序时,默认情况下会启动数据库实例作为驱动程序的一部分,并且只要您挂在连接上,数据库就会运行。但是对于 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)); 

一旦数据库运行,您就可以在 JNDI 注册表中粘贴一个 DataSource 实例。然后 Hibernate 可以从 JNDI 注册中心访问这个数据源,给定它的名称。

EmbeddedConnectionPoolDataSource40 dataSource = new EmbeddedConnectionPoolDataSource40();
dataSource.setDatabaseName(databaseName);
dataSource.setUser(username);
dataSource.setPassword(password);

EmbeddedConnectionPoolDataSource40 是与池化 DataSource 包装器一起使用的 DataSource 实现,因此可以在可能的情况下重用连接。我使用了 Apache Commons DBCP,并修改了 examples 之一,以使用 EmbeddedConnectionPoolDataSource40 创建我自己的池数据源。

【讨论】:

    【解决方案2】:

    您似乎将 Derby 作为embedded DB 而不是 DB 服务器运行。

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

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

    【讨论】:

    • 另一种方法是在运行代码之前断开与工具中的数据库的连接 - 通过Data Source Explorer 视图。
    猜你喜欢
    • 1970-01-01
    • 2017-07-27
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多