使用 jdbc:embedded-database 时如何连接到 Spring 创建的 HSQL?

Posted

技术标签:

【中文标题】使用 jdbc:embedded-database 时如何连接到 Spring 创建的 HSQL?【英文标题】:How to connect to HSQL which Spring creates when jdbc:embedded-database is used? 【发布时间】:2012-02-11 08:55:51 【问题描述】:

我有一个 Spring 自动为我创建的 HSQL 数据库:

<jdbc:embedded-database id="dataSource" type="HSQL">
    <jdbc:script location="classpath:scheme.sql" /
</jdbc:embedded-database>

现在我想连接到这个数据库。我的问题是如何做到这一点,因为我不知道应该使用哪个地址。

【问题讨论】:

“连接到”是什么意思?你想在你的spring bean中使用它还是想连接外部数据库浏览器? @peter-gwiazda 我的意思是如何使用外部数据库浏览器连接到它。 在服务器模式下运行 HSQLDB。你也可以查看H2数据库。 roytuts.com/embedded-hsql-database-with-spring/ 【参考方案1】:

对于某些人来说,一个足够的解决方案是使用 h2 控制台 - 如下所述:

spring boot default H2 jdbc connection (and H2 console)

您必须只记得在需要的地方设置 hsqldb 驱动程序。这样数据库就不必单独启动了。您也无需安装任何其他软件即可浏览它。

【讨论】:

【参考方案2】:

您可以以正常方式连接到嵌入式数据库,(SQL Developer、SQL Explorer 等);我用我的调试器查看了我用 Spring 创建的嵌入式数据库 bean 中的 URL 属性,在你的例子中是 dataSource。我认为您的网址类似于jdbc:hsqldb:mem:dataSource

【讨论】:

肯定不行,因为内存数据库只能在一个JVM进程中使用。【参考方案3】:

你可以这样做

final ApplicationContext ctx = new ClassPathXmlApplicationContext("dao-context.xml");
final DataSource dataSource = (DataSource)ctx.getBean("dataSource");
final Connection conn = dataSource.getConnection();

【讨论】:

【参考方案4】:

Embedded-database 是一个内存数据库,Spring 支持 HSQL、H2 和 Derby。您可以前往他们各自的网站了解连接详情。

对于 H2,请参阅 here 。 对于 HSQL,请参阅 here 和 here。

据我了解,

<jdbc:embedded-database id="dataSource" type="HSQL">
  <jdbc:script location="classpath:scheme.sql" /
</jdbc:embedded-database>

使用内存数据库,因此无法从外部访问。您将能够在同一个 VM 和同一个类加载器中访问它。

【讨论】:

我们可以使用 XML 文件加载到数据库中【参考方案5】:

这个嵌入式 HSQL 数据库是全内存和进程内的,因此只能从 Spring Java 进程访问。如果您还想从其他工具访问数据库,例如使用数据库管理器检查内容,您可以使用全内存实例启动 HSQLDB 服务器,然后从 Spring 和其他工具连接到服务器。

这在 HSQLDB 指南http://hsqldb.org/doc/2.0/guide/listeners-chapt.html中有介绍

使用以下命令启动服务器:

java -cp ../lib/hsqldb.jar org.hsqldb.Server --database.0 mem:test --dbname.0 test

您需要使用用户名“SA”和密码“”创建一个 Spring 数据源。配置Spring数据源的数据库驱动和URL(来自同一台机器)是:

org.hsqldb.jdbcDriver
jdbc:hsqldb:hsql://localhost/test

【讨论】:

当我运行java -cp ~/.m2/repository/org/hsqldb/hsqldb/2.0.0/hsqldb-2.0.0.jar org.hsqldb.util.DatabaseManagerSwing 并使用jdbc:hsqldb:hsql://localhost/test 时出现错误:java.sql.SQLTransientConnectionException: java.net.ConnextException: Connection refused java -cp ../lib/hsqldb.jar org.hsqldb.Server... 运行没有错误? @peter-gwiazda 当我手动运行服务器时,我可以使用提供的命令连接到它。但在我的情况下,Spring 启动服务器,所以我询问如何连接到由 Spring 运行的 HSQL .. 这是不可能的。您必须手动运行服务器并连接 Spring 应用程序和其他应用程序。在嵌入模式下,您只能在同一个 JVM 中访问。服务器模式有什么问题?你在数据库中保留了什么?为什么每次使用应用程序都重新启动数据库? 你说得对,我无法从另一个 JVM 进程连接到 HSQL。我已经使用 H2 控制台来实现这一点。今天我找到了另一种使用 Spring 和 HSQL 实现这一目标的方法:mkyong.com/spring/…【参考方案6】:

我建议你使用外部数据库,但如果你想使用 HSQL,那么这可能会对你有所帮助http://java.dzone.com/articles/spring-3-makes-use-embedded-easy

【讨论】:

+1,此外 ContextConfiguration 集成测试的事务注释将默认回滚,使开发数据库在测试后安全且一致。

以上是关于使用 jdbc:embedded-database 时如何连接到 Spring 创建的 HSQL?的主要内容,如果未能解决你的问题,请参考以下文章

怎么使用hsqldb 和 mybatis 构造单元测试

测试使用

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)