Spring 当配置为这样做时,引导不使用 HSQLDB 的基于文件的数据库
Spring Boot does not use HSQLDB's file based database when configured to do so
我创建了一个 Spring 引导应用程序,我想使用 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 启动时,它会找到 schema.sql 并创建数据库。问题是 Spring 引导调用了数据库 "testdb" 并且它显然是 "memory only" 模式并且没有保存到定义的位置;
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 框架很有帮助。更好的解决方案是简单地检查开发人员是否先设置了这些值,然后再盲目地覆盖它们。
为了我在 IoT 环境中构建具有嵌入式数据库的特定单一用途 Web 服务器的目的,Spring Boot + Spring JDBC 需要额外的开发。
您可以在此处找到 HSQLDB 的硬编码配置; GitHub Master Branch
--快速修复 [已弃用!!!请参阅下文以获得更好的修复!]
将 类 从 org/springframework/jdbc/datasource/embedded 目录复制到您自己的目录。更改文件以反映您的配置并将其添加到您的配置 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();
}
}
禁用数据源自动配置:
@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)
}
我创建了一个 Spring 引导应用程序,我想使用 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 启动时,它会找到 schema.sql 并创建数据库。问题是 Spring 引导调用了数据库 "testdb" 并且它显然是 "memory only" 模式并且没有保存到定义的位置;
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 框架很有帮助。更好的解决方案是简单地检查开发人员是否先设置了这些值,然后再盲目地覆盖它们。
为了我在 IoT 环境中构建具有嵌入式数据库的特定单一用途 Web 服务器的目的,Spring Boot + Spring JDBC 需要额外的开发。
您可以在此处找到 HSQLDB 的硬编码配置; GitHub Master Branch
--快速修复 [已弃用!!!请参阅下文以获得更好的修复!]
将 类 从 org/springframework/jdbc/datasource/embedded 目录复制到您自己的目录。更改文件以反映您的配置并将其添加到您的配置 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();
}
}
禁用数据源自动配置:
@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) }