Java Spring Boot不使用HSQLDB';配置为基于文件的数据库时

Java Spring Boot不使用HSQLDB';配置为基于文件的数据库时,java,spring,spring-boot,spring-data,hsqldb,Java,Spring,Spring Boot,Spring Data,Hsqldb,我已经创建了一个SpringBoot应用程序,我想使用HSQLDB将数据存储在与可执行JAR文件相同的目录中。我在resources目录中创建了“application.properties”文件和“schema.sql”。在应用程序配置中,如下所示: spring.datasource.url=jdbc:hsqldb:file:data/mydb spring.datasource.username=SA spring.datasource.password=lEtmEIn spring.da

我已经创建了一个SpringBoot应用程序,我想使用HSQLDB将数据存储在与可执行JAR文件相同的目录中。我在resources目录中创建了“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启动时,它找到schema.sql并创建了数据库。问题是Spring引导称为数据库“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框架是有益的。更好的解决方案是,在盲目地重写这些值之前,先检查开发人员是否设置了这些值

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

您可以在这里找到HSQLDB的硬编码配置

--快速修复[已弃用!!!有关更好的修复方法,请参见下文!]

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

@Bean
public DataSource dataSource() {
    MyEmbeddedDatabaseBuilder builder = new MyEmbeddedDatabaseBuilder();
    return builder.setType(MyEmbeddedDatabaseType.HSQL).build();
}
最好的方法是使用Spring管道对数据源对象进行更兼容的实例化

不过,他们不应该硬编码嵌入的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();
    }

}
  • 禁用数据源自动配置:

    @SpringBootApplication
    @EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
    public class Application{  
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    } 
    
  • 编写您自己的数据源配置bean:

    @Bean(initMethod="init", destroyMethod="close")
    @Profile("test")
    public DataSource getHsqlDataSource(){
        AtomikosNonXADataSourceBean ds = new AtomikosNonXADataSourceBean(); 
        ds.setUniqueResourceName("hsqldb"); 
        ds.setDriverClassName("org.hsqldb.jdbcDriver"); 
        ds.setUrl("jdbc:hsqldb:file:db/testdb;readonly=true;"); 
        ds.setUserName("sa"); 
        ds.setPassword(""); 
        ds.setPoolSize(3)
    }
    

  • 您确定实际使用了
    应用程序.properties
    文件吗?如果您正在使用执行器,则可以检查/configprops或/env端点;{“dataSourceClassName”:null,“properties”:{},“separator”:“,“url”:“jdbc:hsqldb:file:data/mydb”,“platform”:“all”,“continueOnError”:false,“jndiName”:null,“sqlScriptEncoding”:null,“password”:null,“driverClassName”:“org.hsqldb.jdbc.JDBCDriver”,“initialize”:true,“username”:“SA”}--sooo!我假设配置已读取,只是没有得到尊重。我猜spring没有获得
    应用程序.properties
    。我写的和你一样,工作很好。只要稍加努力,你就可以让Spring将配置加载到类中,但这很烦人!我希望他们在这么笨拙之前仔细考虑一下。我更新了我的答案,使用了您关于排除课程的输入,谢谢!