【问题标题】:i want to execute another function in each database我想在每个数据库中执行另一个函数
【发布时间】:2017-03-06 07:00:22
【问题描述】:

我有一个使用数据库(域、jdbcTemplate、mysql)的 Spring Boot 项目

但是另一个项目的成员无法连接我的mysql数据库。

所以我想让嵌入式 h2 数据库在我们开发时为其他成员提供 spring boot

但我遇到的小问题是 mysql 的 sql 和 h2 的 sql 不同。我们必须使用csv数据导入sql。

mysql:加载数据...... h2 : INSERT INTO 表 SELECT * FROM CSVREAD(csvfile)

如果我们为mysql和h2做每一个方法,我们部署的时候就得改代码。

这是解决这个问题的任何解决方案吗?

谢谢:)

【问题讨论】:

  • 使用像 Hibernate 这样的持久化 API 来避免此类问题。
  • @rathna 感谢您的回复。我为我的项目找到了一些信息,我认为我的项目不适合。原因首先我必须控制超过 1M 的大量数据,并且我必须执行不适合 ORM 的工作,例如创建/删除表和加载数据。请给我建议,谢谢 :)

标签: database spring spring-boot h2 jdbctemplate


【解决方案1】:

将特定于数据库的数据加载到实现接口并使用配置文件激活组件的单独组件中。因此,在本地开发时说您将使用“本地”配置文件运行您的应用程序。像这样的:

public interface SpecialDataLoader {
  void loadData();
}

@Component
// no @Profile annotation, will be used by default
public class MySqlDataLoader implements SpecialDataLoader {
  @Override public void loadData() {
    // .. do it LOAD DATA way
  }
}

@Component
@Profile("local") // component will be used when "local" profile is active
public class H2DataLoader implements SpecialDataLoader {
  @Override public void loadData() {
    // .. do it INSERT INTO table SELECT * FROM CSVREAD(csvfile) way
  }
}

@Component
public ClassThatUsesTheLoader {

  @Autowired SpecialDataLoader specialDataLoader; // the right component will be autowired depending on the profile here

  void useSpecialDataLoader() {
    specialDataLoader.loadData();
  }
}

现在在本地开发时,您可以使用命令行参数--spring.profiles.active=local 运行您的应用程序,并且将使用H2DataLoader。在生产中根本不需要指定配置文件,MySqlDataLoader 将被使用。

请阅读个人资料上的relevant documentation 以及如何使用它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 2016-06-18
    相关资源
    最近更新 更多