我有一个很大的data.sql文件,可以在应用程序启动时将数据加载到H2中。
这是我的data.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
有人可以建议我如何解决此问题吗?有提示吗?
答案 0 :(得分:0)
我能够通过以编程方式配置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:
@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.
}
创建一个单独的Bean以便将数据插入表很重要。您也可以在DataSource bean中运行准备好的语句,但这对我不起作用。因此,在全部设置了DataSource之后,我在其外部插入了数据。