Reb*_*orn 3 java spring jdbc spring-jdbc
我将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;
}
Run Code Online (Sandbox Code Playgroud)
它工作完美,但是我需要为数据库创建指定模式并在其上加载数据。是否有机会像Spring Data一样执行两个脚本(模式脚本和数据脚本)?我发现的唯一的东西是datasource.setSchema(),以及我所担心的,我必须指定它的完整路径。如果我的模式脚本位于src/main/resources/路径中,那么如何指定它呢?(我确实做了,文档怎么说,但失败并显示一条消息)
发生意外错误(类型=内部服务器错误,状态= 500)。org.springframework.jdbc.CannotGetJdbcConnectionException:无法获取JDBC连接。嵌套的异常是org.h2.jdbc.JdbcSQLException:找不到架构“〜/ schema-h2.sql” [90079-193]
谢谢你的建议
您可以执行以下操作:
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;
}
Run Code Online (Sandbox Code Playgroud)
解决方案1
使用这些附加选项更新您的连接 URL:
DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;INIT=CREATE SCHEMA IF NOT EXISTS
Run Code Online (Sandbox Code Playgroud)
解决方案2
您的 src/main/resources 中应该有一个 application.properties 文件,其中应包含以下属性:
spring.datasource.platform=h2
spring.datasource.initialize=true
Run Code Online (Sandbox Code Playgroud)
解决方法
您可以将 INIT 参数与脚本位置脚本放在连接 url 中(作为选项之一):
jdbc:h2:mem:test;INIT=RUNSCRIPT FROM '~/schema.sql'\;RUNSCRIPT FROM '~/data.sql'
Run Code Online (Sandbox Code Playgroud)
此功能是通过 INIT 属性启用的。请注意,可以将多个命令传递给 INIT,但必须对分号分隔符进行转义,如下例所示。
| 归档时间: |
|
| 查看次数: |
3849 次 |
| 最近记录: |