Java Spring Boot不使用HSQLDB';配置为基于文件的数据库时
我已经创建了一个SpringBoot应用程序,我想使用HSQLDB将数据存储在与可执行JAR文件相同的目录中。我在resources目录中创建了“application.properties”文件和“schema.sql”。在应用程序配置中,如下所示: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
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(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将配置加载到类中,但这很烦人!我希望他们在这么笨拙之前仔细考虑一下。我更新了我的答案,使用了您关于排除课程的输入,谢谢!