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

Java 在应用程序启动时执行多个脚本,java,spring,jdbc,spring-jdbc,Java,Spring,Jdbc,Spring Jdbc,我将数据源定义为bean: @Bean(name="dataSource") public DriverManagerDataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("org.h2.Driver"); dataSource.setUrl("jdbc:h2:~/myDB");

我将数据源定义为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;
}
它工作得很好,但是我需要为db创建指定模式并在其上加载数据。是否有机会像Spring数据一样执行这两个脚本(模式和数据脚本)?我唯一找到的是
datasource.setSchema()
,而且我还必须指定它的完整路径。如果我的模式脚本位于
src/main/resources/
路径中,那么如何指定它?(我确实这么做了,怎么说,但没有一条消息)

出现意外错误(类型=内部服务器错误,状态=500)。 org.springframework.jdbc.CannotGetJdbcConnectionException:无法获取jdbc连接;嵌套异常为org.h2.jdbc.jdbcsql异常:未找到模式“~/Schema-h2.sql”[90079-193]


感谢您的建议解决方案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中(作为选项之一):

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


您可以这样做:

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

import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
导入org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
@Bean(name=“dataSource”)
公共静态数据源H2DataSource(){
返回新的EmbeddedDatabaseBuilder()
.setName(“testdb”)
.setType(EmbeddedDatabaseType.H2)
.addScripts(“您在/resources中的脚本”)
.build();
}

目前如何加载模式?我无法在atm上加载,因为spring无法找到它的位置。正如我前面所说的
datasource.setSchema(字符串路径)
需要sql的完整路径。您是否尝试过“classpath:schema-h2.sql”看看这个答案:,重要的一点:
src/main/resources/
成为类路径,因此文件
src/main/resources/test.sql
必须加载
classpath:test.xml
so,没有机会通过spring实现它?我做了一些变通,这正是我所需要的!我设法运行了模式和数据脚本。
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;
}