配置为执行此操作时,Spring Boot不使用HSQLDB的基于文件的数据库

Joh*_*ant 4 java spring hsqldb spring-data spring-boot

我创建了一个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
Run Code Online (Sandbox Code Playgroud)

当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.
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*ant 8

在研究之后,我发现尽管你有H2,Derby或HSQLDB的配置设置,Spring JDBC实际上对内存数据库进行了硬编码.

我认为他们认为这有助于测试和学习Spring Framework.一个更好的解决方案是简单地检查开发人员是否在盲目地编写它们之前首先设置了这些值.

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

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

--QUICK FIX [已弃用!!! 请参阅下面的更好修复!]

将类从org/springframework/jdbc/datasource/embedded目录复制到您自己的目录.更改文件以反映您的配置并将其添加到您的配置bean;

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

最好的路由是使用Spring管道对Datasource对象进行更兼容的实例化.

但它们不应该使嵌入式DB类硬编码.这真的很难立即使用这些精彩的功能.现在,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();
    }

}
Run Code Online (Sandbox Code Playgroud)