java - 配置为这样做时,Spring Boot 不使用 HSQLDB 的基于文件的数据库

标签 java spring spring-boot spring-data hsqldb

我创建了一个 Spring Boot 应用程序,我想使用 HSQLDB 将数据存储在与可执行 JAR 文件相同的目录中。我在资源目录中创建了“application.properties”文件和“schema.sql”。在应用程序配置如下;

spring.datasource.url=jdbc:hsqldb:file:data/mydb
spring.datasource.username=SA
spring.datasource.password=lEtmEIn
spring.datasource.driver-class-name=org.hsqldb.jdbc.JDBCDriver

当 Spring Boot 启动时,它找到了 schema.sql 并创建了数据库。问题是 Spring Boot 将数据库称为“testdb”,它显然是“仅内存”模式,不会保存到定义的位置;

2015-09-04 08:48:00.985  INFO 30180 --- [           main] o.s.j.d.e.EmbeddedDatabaseFactory        : Creating embedded database 'testdb'
2015-09-04 08:48:01.415  INFO 30180 --- [           main] o.s.jdbc.datasource.init.ScriptUtils     : Executing SQL script from URL [file:/D:/GitHub/REDACTED/target/classes/schema.sql]
2015-09-04 08:48:01.423  INFO 30180 --- [           main] o.s.jdbc.datasource.init.ScriptUtils     : Executed SQL script from URL [file:/D:/GitHub/REDACTED/target/classes/schema.sql] in 8 ms.

我如何告诉 Spring Boot 停止使用基于内存的 HSQLDB 并遵守我的配置?

最佳答案

经过研究,我发现 Spring JDBC 实际上对内存数据库进行了硬编码,尽管您的配置设置为 H2、Derby 或 HSQLDB。

我猜他们认为这对测试和学习 Spring Framework 是有益的。更好的解决方案是简单地检查开发人员是否先设置了这些值,然后再盲目地覆盖它们。

对于我在 IoT 环境中构建具有嵌入式数据库的特定单一用途 Web 服务器的目的,Spring Boot + Spring JDBC 需要额外的开发。

您可以在此处找到 HSQLDB 的硬编码配置; GitHub Master Branch

--快速修复 [已弃用!!!请参阅下面以获得更好的修复!]

将 org/springframework/jdbc/datasource/embedded 目录中的类复制到您自己的目录中。更改文件以反射(reflect)您的配置并将其添加到您的配置 bean;

@Bean
public DataSource dataSource() {
    MyEmbeddedDatabaseBuilder builder = new MyEmbeddedDatabaseBuilder();
    return builder.setType(MyEmbeddedDatabaseType.HSQL).build();
}

最好的方法是使用 Spring 管道对数据源对象进行更符合规范的实例化。

虽然他们不应该对嵌入式数据库类进行硬编码。开箱即用确实很难使用这些出色的功能。随着 Web 服务器现在被用于简单和特定的任务,这种需求将变得更加明显。

--最佳解决方案!

这意味着您必须为数据源使用不同的配置结构(由@ConfigurationProperties 定义),但它无需复制代码即可工作。更简单;

@SpringBootApplication
@EnableTransactionManagement
@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class,
        DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class })
public class MyApplication {

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(MyApplication.class);
        app.setWebEnvironment(false);
        app.run(args);
    }

    @Bean
    @ConfigurationProperties("my.datasource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

}

关于java - 配置为这样做时,Spring Boot 不使用 HSQLDB 的基于文件的数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32398935/

相关文章:

java - 打印一定范围内的不重复随机数

spring - spring-boot-starter-data-elasticsearch导致未知设置analyzer/search_analyzer和index.settings.analysis.analyzer.autocomplete

Java Spring Hibernate 模式验证 : Missing Table

spring - 用于 Spring Boot 应用程序的 JUnit @BeforeClass 非静态工作

java - RESTful 客户端/服务器的 HTTPS 通信问题

java - java中屏蔽XML标签值的问题

java - 在其他计算机上找不到主类错误

Java正则表达式从字符串中获取数字

java - Spring、Hibernate 检查我的 Maven Shade JAR 中的每个 jar

java - 如何在 Tomcat 中为 Spring 提供一个类?