我将DataSource定义为bean:
@Bean(name="dataSource")
public DriverManagerDataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("org.h2.Driver");
dataSource.setUrl("jdbc:h2:~/myDB");
dataSource.setUsername("sa");
dataSource.setPassword("");
return dataSource;
}
它工作正常,但是我需要为数据库创建指定模式并在其上加载数据。有没有机会像Spring Data那样执行两个脚本(模式和数据脚本)?我发现的唯一的事情是datasource.setSchema()
以及我所关心的我必须指定它的完整路径。然后如果我的架构脚本位于src/main/resources/
路径中,如何指定它? (我确切地说,documentation如何说,但它失败并留言)
出现意外错误(type = Internal Server Error,status = 500)。 org.springframework.jdbc.CannotGetJdbcConnectionException:无法获取JDBC连接;嵌套异常是org.h2.jdbc.JdbcSQLException:Schema"〜/ schema-h2.sql"找不到[90079-193]
感谢您的建议
答案 0 :(得分:5)
您可以这样做:
import org.springframework.jdbc.datasource.init.DatabasePopulator;
import org.springframework.jdbc.datasource.init.DatabasePopulatorUtils;
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
@Bean(name="dataSource")
public DriverManagerDataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("org.h2.Driver");
dataSource.setUrl("jdbc:h2:~/myDB");
dataSource.setUsername("sa");
dataSource.setPassword("");
// schema init
Resource initSchema = new ClassPathResource("script/schema.sql");
DatabasePopulator databasePopulator = new ResourceDatabasePopulator(initSchema);
DatabasePopulatorUtils.execute(databasePopulator, dataSource);
return dataSource;
}
答案 1 :(得分:2)
解决方案1
使用以下附加选项更新您的连接网址:
DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;INIT=CREATE SCHEMA IF NOT EXISTS
解决方案2
你的src / main / resources中应该有一个应该包含这些属性的application.properties文件:
spring.datasource.platform=h2
spring.datasource.initialize=true
解决方法强>
您可以将INIT params与脚本位置脚本放在您的连接URL中(作为其中一个选项):
jdbc:h2:mem:test;INIT=RUNSCRIPT FROM '~/schema.sql'\;RUNSCRIPT FROM '~/data.sql'"
此功能通过INIT属性启用。注意 多个命令可以传递给INIT,但是分号分隔符 必须进行转义,如下例所示。
答案 2 :(得分:1)
这里是Spring official document - Creating an Embedded Database Programmatically。
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
@Bean(name = "dataSource")
public static DataSource H2DataSource() {
return new EmbeddedDatabaseBuilder()
.setName("testdb")
.setType(EmbeddedDatabaseType.H2)
.addScripts("Your scripts in /resources")
.build();
}