Загрузка данных из файла при инициализации данных в H2 - PullRequest
0 голосов
/ 29 октября 2018

У меня большой файл data.sql для загрузки данных в H2 при запуске приложения.

Это часть моих данных.sql

CREATE TRIGGER AU_TRIGGER
AFTER UPDATE ON TABLE_A FOR EACH ROW
CALL "com.trigger.MyTrigger";

LOAD DATA LOW_PRIORITY INFILE 'C:/Users/mytextfile.delim'
REPLACE INTO TABLE TABLE_B
FIELDS TERMINATED BY '|'
IGNORE 1 LINES
(name, age, etc);

Когда я запускаю приложение, все запросы в data.sql выполняются нормально, но как только он достигает LOAD DATA... части, я получаю эту ошибку:

Причина: org.h2.jdbc.JdbcSQLException: синтаксическая ошибка в операторе SQL "LOAD [*] DATA LOW_PRIORITY INFILE ... [42000-197]

This is my application.yml spring.datasource.url
=jdbc:h2:mem:mydb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL
spring.datasource.username: myusername
spring.datasource.password: mypassword
driver-class-name: org.h2.Driver

Может кто-нибудь предложить мне, как решить эту проблему, пожалуйста? Любой намек?

1 Ответ

0 голосов
/ 30 октября 2018

Мне удалось решить эту проблему путем программной настройки H2.

@Bean
public DataSource dataSource() throws SQLException {        
    EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
    EmbeddedDatabase db = builder
            .setType(EmbeddedDatabaseType.H2)
            .setName("mydb;MODE=MYSQL")
            .addScript("mariadb.sql") //this file name has to be different than data.sql otherwise Springboot will pick data.sql automatically and this will also run.
            .build();       
    return db;
}

Затем создайте еще один компонент, который зависит от указанного выше источника данных:

@Bean
@DependsOn("dataSource")
public Void string(DataSource db) throws SQLException {
    //read file using whatever means. I used Scanner and delimeted it myself. 
    final Connection connection = db.getConnection();
    //here use the prepratedStatements 
    PreparedStatement stmt = connection.prepareStatement(Insert xyz); //lookup how to use PreparedStatement. 
    }

Важно создать отдельный компонент, который будет вставлять данные в таблицы. Вы также можете запустить подготовленный оператор внутри компонента DataSource, но он не сработал для меня. Поэтому я вставил данные вне его после того, как DataSource все установлено.

...