【问题标题】:Multiple instances of Flyway pointing to different Datasources in Java applicationFlyway的多个实例指向Java应用程序中的不同数据源
【发布时间】:2012-11-17 10:02:07
【问题描述】:

我在 Eclipse 工作区的 2 个不同项目中创建了两个不同的 Flyway 实例。

它们指向不同的数据源/2 个差异数据库,并且还有单独的 src.main.resources.db.migration 包。每个包都包含各自数据库的不同 sql 文件。

当我启动我的应用程序时,Flyway 仅识别来自一个项目的脚本(首先初始化项目)并将脚本从这个项目执行到另一个数据库。

Flyway 是否可以同时更新 2 个数据库?


感谢您的回复。但是您能否解释一下如何在 Java 代码中实现这一点。 例如:目前我正在使用以下方式...

            Flyway flyway = new Flyway();               
            InitialContext ictx = new InitialContext();
            DataSource dataSource = (DataSource) ictx.lookup("DS-name");
            flyway.setDataSource(dataSource);
            flyway.setLocations("main.resources.db.migration");//location under first project
                flyway.migrate();

                 Flyway flywaygen =  new Flyway;

            InitialContext ictx = new InitialContext();
            DataSource dataSource = (DataSource) ictx.lookup("DS-name");
            flywaygen.setDataSource(dataSource);
            flywaygen.setLocations("main.resources.emlogis.migration");//location                       under second project
                flywaygen.migrate();

问题是 flywaygen 也在寻找第一个项目位置。因此,如果在第一个位置添加了 3 个 sql 脚本,在第二个位置添加了 2 个脚本,则第二个 flyway 实例显示迁移 3 已完成。所以 flywaygen 也指向 main.resources.db.migration 而不是 main.resources.emlogis.migration。

【问题讨论】:

    标签: java eclipse flyway


    【解决方案1】:

    定义第二个flyway bean。然后向两个 flyway bean 添加不同的 SqlMigrationPrefix 属性并相应地命名您的迁移脚本。

    例如

    <bean class="com.googlecode.flyway.core.Flyway" init-method="migrate">
       <property name="dataSource" ref="dataSource1" />
       <property name="sqlMigrationPrefix" value="DB1_" />
    </bean>
    <bean class="com.googlecode.flyway.core.Flyway" init-method="migrate">
       <property name="dataSource" ref="dataSource2" />
       <property name="sqlMigrationPrefix" value="DB2_" />
    </bean>
    

    您的迁移脚本必须遵循以下命名方案:

    DB1_1.0__initial_setup.sql
    DB1_1.1__new_column.sql
    
    DB2_1.0__initial_setup.sql
    DB2_1.1__new_column.sql
    

    编辑 - 代码配置:

    在您的代码中,您有两个 Flyway 实例。这个实例相当于定义为一个spring bean。因此,您可以调用以下方法来实现相同的目的:

    flyway.setSqlMigrationPrefix("DB1_");
    flywaygen.setSqlMigrationPrefix("DB2_");
    

    【讨论】:

    • 您好,感谢您的回复。但是您能否解释一下如何在 Java 代码中实现这一点。例如:目前我正在使用以下方式...
    • 但是我怎样才能指定分开的位置。因为目前两个flyway实例都指向同一个位置 flyway.setLocations("main.resources.db.migration");但是在两个不同的项目中。当我的应用程序启动时,只有 flyway get 是迁移脚本。 flyway 实例什么都不做。
    • 你为什么不把flyway.setLocation()指向另一个包?您的 dataSource 定义是否指向数据库 1 和 2?在您的示例代码中,它们没有。
    • 是的。他们都指向不同的位置。我做了 flyway.setLocation() 现在工作正常。感谢您的帮助。
    猜你喜欢
    • 2021-12-18
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多