使用 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?的主要内容,如果未能解决你的问题,请参考以下文章