【问题标题】:Running two flyway migration simultaneously using tomcat cluster, fails the migration on one of the server使用tomcat集群同时运行两个flyway迁移,其中一台服务器上的迁移失败
【发布时间】:2014-12-27 11:32:45
【问题描述】:

我正在尝试使用两个 tomcat 在集群中运行我的应用程序,当同时启动两个 tomcat 时,一个 tomcat 上的迁移失败。我的弹簧配置是 -

<bean id="flyway" class="com.googlecode.flyway.core.Flyway" init-method="migrate">
<property name="dataSource" ref="dataSource"/>
<property name="initOnMigrate" value="true" />
</bean>

我还将 innodb_lock_wait_timeout 增加到 900,mysql 版本是 5.6.15

请帮帮我,日志是 -

org.springframework.beans.factory.BeanCreationException:在类路径资源 [spring/db.xml] 中定义名称为“flyway”的 bean 创建错误:调用 init 方法失败;嵌套异常是 com.googlecode.flyway.core.api.FlywayException: Unable to insert row for version '1' in metadata table connect_dev.schema_version 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1554) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 在 org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:975) 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:752) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 在 org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403) 在 org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) 在 org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) 在 org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4937) 在 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5434) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 在 org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901) 在 org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) 在 org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633) 在 org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1120) 在 org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1678) 在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:745) 原因:com.googlecode.flyway.core.api.FlywayException:无法在元数据表connect_dev.schema_version 中插入版本“1”的行 在 com.googlecode.flyway.core.metadatatable.MetaDataTableImpl.addAppliedMigration(MetaDataTableImpl.java:158) 在 com.googlecode.flyway.core.metadatatable.MetaDataTableImpl.addInitMarker(MetaDataTableImpl.java:280) 在 com.googlecode.flyway.core.command.DbInit$1.doInTransaction(DbInit.java:95) 在 com.googlecode.flyway.core.command.DbInit$1.doInTransaction(DbInit.java:74) 在 com.googlecode.flyway.core.util.jdbc.TransactionTemplate.execute(TransactionTemplate.java:72) 在 com.googlecode.flyway.core.command.DbInit.init(DbInit.java:74) 在 com.googlecode.flyway.core.Flyway$1.execute(Flyway.java:841) 在 com.googlecode.flyway.core.Flyway$1.execute(Flyway.java:819) 在 com.googlecode.flyway.core.Flyway.execute(Flyway.java:1200) 在 com.googlecode.flyway.core.Flyway.migrate(Flyway.java:819) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:483) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1682) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1621) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1550) ... 27 更多 引起:com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException:尝试获取锁时发现死锁;尝试重启事务 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:408) 在 com.mysql.jdbc.Util.handleNewInstance(Util.java:406) 在 com.mysql.jdbc.Util.getInstance(Util.java:381) 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1045) 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) 在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491) 在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423) 在 com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936) 在 com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060) 在 com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542) 在 com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734) 在 com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2019) 在 com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1937) 在 com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1922)

【问题讨论】:

  • 请升级到 Flyway 3.0 并重试。如果问题仍然存在,请在 GitHub 上使用两个节点的调试日志提交问题。

标签: mysql flyway


【解决方案1】:

在你的 Spring 数据源中配置一个 maxWait 值,看看这是否改变了情况。

【讨论】:

    猜你喜欢
    • 2012-07-21
    • 2019-01-16
    • 2020-05-24
    • 2020-02-25
    • 2015-08-19
    • 2012-08-09
    • 2016-12-12
    • 2014-08-02
    • 1970-01-01
    相关资源
    最近更新 更多