在应用程序启动时执行多个脚本

问题描述 投票:0回答:3

我将 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 的说法做了,但失败并显示一条消息)

出现意外错误(类型=内部服务器错误,状态=500)。 org.springframework.jdbc.CannotGetJdbcConnectionException:无法获取 JDBC 连接;嵌套异常是 org.h2.jdbc.JdbcSQLException: Schema "~/schema-h2.sql" not found [90079-193]

谢谢大家的建议

java spring jdbc spring-jdbc
3个回答
9
投票

你可以这样做:

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;
}

4
投票

解决方案 1

使用这些附加选项更新您的连接 url:

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 参数放在您的连接 url 中(作为选项之一):

jdbc:h2:mem:test;INIT=RUNSCRIPT FROM '~/schema.sql'\;RUNSCRIPT FROM '~/data.sql'

此功能通过 INIT 属性启用。注意 可以向 INIT 传递多个命令,但分号分隔符 必须转义,如下例所示。


1
投票

这里是Spring官方文档-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();
    }
© www.soinside.com 2019 - 2024. All rights reserved.