2015-09-04 152 views
3

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

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. 

我怎么知道春天引导使用基于HSQLDB的内存退出并兑现我的配置?

+1

你确定你的'application.properties'文件实际使用?如果您使用执行器,则可以检查/ configprops或/ env端点。 –

+0

我检查了/ configprops并查看以下内容; { “dataSourceClassName”:NULL, “属性”:{}}, “分离器”: “;”, “URL”: “JDBC:HSQLDB:文件:数据/ MYDB”, “平台”: “所有”, “continueOnError” :假的, “jndiName”:空, “sqlScriptEncoding”:空, “密码”:空 “driverClassName”: “org.hsqldb.jdbc.JDBCDriver”, “初始化”:真正的 “用户名”: “SA”}} --- Soooo!我假设配置被读取,只是没有荣幸 –

+0

我的猜测是,春天没有得到'application.properties'。我写的和你一样,而且工作正常。 – russellhoff

回答

5

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

我认为他们认为这对于测试和学习Spring框架是有益的。一个更好的解决方案可以简单地检查开发人员是否先设置了这些值,然后盲目地写入它们。

为了我的目的,我在一个物联网设置中构建了一个具有嵌入式数据库的特定单一目的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(); 
} 

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

虽然他们不应该使嵌入式DB类硬编码。它确实很难使用这些奇妙的功能。随着Web服务器现在被用于简单和特定的任务,这种需求将变得更加明显。

--BEST SOLUTION!

这意味着您必须为数据源使用不同的配置结构(由@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(); 
    } 

} 
0
  1. 禁用数据源自动配置:

    @SpringBootApplication 
    @EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class}) 
    public class Application{ 
        public static void main(String[] args) { 
         SpringApplication.run(Application.class, args); 
        } 
    } 
    
  2. 编写您自己的数据源配置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) 
    } 
    
+0

我使用关于排除类的输入更新了我的答案,谢谢! –

相关问题