2015-09-04 82 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

我使用關於排除類的輸入更新了我的答案,謝謝! –

相關問題