【问题标题】:How to create a database during spring context initialization如何在 spring 上下文初始化期间创建数据库
【发布时间】:2016-02-26 13:19:56
【问题描述】:

我需要在我的本地 mysql 服务器中创建一个名为 test 的数据库,我将使用它来设置我的数据源 bean。我正在使用以下 spring 配置为我的测试设置数据源和 jdbctemplate

@Configuration
class Config {
        @Bean(initMethod = "setupDatabase")
      public DataSource getDataSource() {
        String url = "jdbc:mysql://localhost:3306/test";
        DriverManagerDataSource dataSource = new DriverManagerDataSource(
                url, settings.getUsername(), settings.getPassword());
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        return dataSource;
      }

      @Bean
      public JdbcTemplate getJdbcTemplate() {
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(((DataSourceTransactionManager)transactionManager()).getDataSource());
        return jdbcTemplate;
      }

      @Bean
      public PlatformTransactionManager transactionManager() {
        return new DataSourceTransactionManager(getDataSource());
      }

      @Bean
      public DataSourceInitializer dataSourceInitializer(final DataSource dataSource) {
        final DataSourceInitializer initializer = new DataSourceInitializer();
        initializer.setDataSource(dataSource);
        initializer.setDatabasePopulator(databasePopulator());
        return initializer;
      }

      private DatabasePopulator databasePopulator() {
        final ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
        populator.addScript(schemaScript);
        return populator;
      }

      @PostConstruct
      public void setupDatabase() {
        String url = "jdbc:mysql://localhost:3306";
        try {
          Connection connection = DriverManager.getConnection(url, settings.getUsername(), settings.getPassword());
          Statement statement = connection.createStatement();
          statement.execute("create database test");
        } catch (SQLException exception) {
          LOGGER.error("Could not setup database for test", exception);
          throw new RuntimeException(exception);
        }
    }
}

我收到以下错误原因:

org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'test'
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80)
    at org.springframework.jdbc.datasource.init.DatabasePopulatorUtils.execute(DatabasePopulatorUtils.java:46)

谁能解释一下这个配置出了什么问题?

【问题讨论】:

    标签: mysql spring datasource javabeans


    【解决方案1】:

    您是否在本地 mysql 上创建了测试数据库?您需要先创建数据库才能从您的应用程序连接。如果您想通过执行 sql 查询来创建数据库,请以 root 用户身份连接到数据库并创建数据库。

    【讨论】:

    • 我希望能够在 spring 上下文初始化时以编程方式创建数据库。如果我手动创建数据库,它可以工作;但我希望能够在上下文初始化期间创建该数据库并在我的 bean 中使用它
    【解决方案2】:

    异常的来源:你的setupDatabase()方法实际上是由Spring执行的AFTERgetDataSource()导致@Bean(initMethod = "setupDatabase")强制Spring执行initMetodAFTER bean初始化的bean创建。但这不是你所期望的。

    你需要以某种方式定义你的getDataSource()依赖于setupDatabase()。例如。在@DependsOn 注释的帮助下。

    另见Spring 3 bean instantiation sequence

    P.S. 但是你为什么不简单地手动将setupDatabase() 调用添加到getDataSource() 方法中呢?

    【讨论】:

      猜你喜欢
      • 2018-09-08
      • 2019-01-10
      • 1970-01-01
      • 2014-06-25
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      • 2016-04-03
      • 2014-09-13
      相关资源
      最近更新 更多