我们使用Flyway v3.2.1、SQLite 3.7.13和org.xerial:sqlite-jdbc:3.8.7驱动程序进行数据库迁移。
最大并行数据库连接数似乎非常重要。但是,使用任何连接池大小都会因不同原因而导致迁移失败。
1. 使用大小为2或更多的连接池
存在与多个并行数据库连接相关的锁定问题。 在空的SQLite数据库上进行单个迁移最终会导致:
最大并行数据库连接数似乎非常重要。但是,使用任何连接池大小都会因不同原因而导致迁移失败。
1. 使用大小为2或更多的连接池
存在与多个并行数据库连接相关的锁定问题。 在空的SQLite数据库上进行单个迁移最终会导致:
o.f.core.internal.command.DbMigrate.(:)() Current version of schema "main": << Empty Schema >>
o.f.core.internal.command.DbMigrate.(:)() Migrating schema "main" to version 1 - initial
o.f.c.i.u.jdbc.TransactionTemplate.(:)() Unable to restore autocommit to original value for connection
java.sql.SQLException: database is locked
at org.sqlite.core.DB.throwex(DB.java:859) ~[sqlite-jdbc-3.8.7.jar:na]
at org.sqlite.core.DB.exec(DB.java:142) ~[sqlite-jdbc-3.8.7.jar:na]
at org.sqlite.jdbc3.JDBC3Connection.setAutoCommit(JDBC3Connection.java:152) ~[sqlite-jdbc-3.8.7.jar:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_71]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_71]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_71]
at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_71]
at org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:126) ~[tomcat-jdbc-7.0.56.jar:na]
at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:109) ~[tomcat-jdbc-7.0.56.jar:na]
at org.apache.tomcat.jdbc.pool.DisposableConnectionFacade.invoke(DisposableConnectionFacade.java:80) ~[tomcat-jdbc-7.0.56.jar:na]
at com.sun.proxy.$Proxy76.setAutoCommit(Unknown Source) ~[na:na]
at org.flywaydb.core.internal.util.jdbc.TransactionTemplate.execute(TransactionTemplate.java:96) [flyway-core-3.2.1.jar:na]
at org.flywaydb.core.internal.command.DbMigrate.applyMigration(DbMigrate.java:282) [flyway-core-3.2.1.jar:na]
at org.flywaydb.core.internal.command.DbMigrate.access$800(DbMigrate.java:46) [flyway-core-3.2.1.jar:na]
at org.flywaydb.core.internal.command.DbMigrate$2.doInTransaction(DbMigrate.java:207) [flyway-core-3.2.1.jar:na]
at org.flywaydb.core.internal.command.DbMigrate$2.doInTransaction(DbMigrate.java:156) [flyway-core-3.2.1.jar:na]
at org.flywaydb.core.internal.util.jdbc.TransactionTemplate.execute(TransactionTemplate.java:72) [flyway-core-3.2.1.jar:na]
at org.flywaydb.core.internal.command.DbMigrate.migrate(DbMigrate.java:156) [flyway-core-3.2.1.jar:na]
at org.flywaydb.core.Flyway$1.execute(Flyway.java:1059) [flyway-core-3.2.1.jar:na]
at org.flywaydb.core.Flyway$1.execute(Flyway.java:1006) [flyway-core-3.2.1.jar:na]
at org.flywaydb.core.Flyway.execute(Flyway.java:1418) [flyway-core-3.2.1.jar:na]
at org.flywaydb.core.Flyway.migrate(Flyway.java:1006) [flyway-core-3.2.1.jar:na]
...
这似乎是一个常见的SQLite陷阱,可以在这里找到描述。
通常情况下,Flyway迁移以及我们剩下的应用程序都遭受频繁的锁定错误:
java.sql.SQLException:[SQLITE_BUSY]数据库文件被锁定
当两个或多个连接处于活动状态时。这就是为什么我们尝试...
2. ...使用大小为1的连接池
我们将并行数据库连接数减少到1(通过使用“maxActive = 1”配置我们的Tomcat JDBC连接池)。
但现在,Flyway失败了。
... org.flywaydb.core.api.FlywayException: Unable to obtain Jdbc connection from DataSource
at org.flywaydb.core.internal.util.jdbc.JdbcUtils.openConnection(JdbcUtils.java:56)
at org.flywaydb.core.Flyway.execute(Flyway.java:1386)
at org.flywaydb.core.Flyway.migrate(Flyway.java:1006)
(...)
Caused by: org.apache.tomcat.jdbc.pool.PoolExhaustedException: [localhost-startStop-1] Timeout: Pool empty. Unable to fetch a connection in 10 seconds, none available[size:1; busy:1; idle:0; lastwait:10000].
at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:674)
at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:188)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:128)
at org.flywaydb.core.internal.util.jdbc.JdbcUtils.openConnection(JdbcUtils.java:50)
为什么?Flyway迁移似乎需要同时使用两个连接。在这里,他们有一个相关的问题,并指出:“看起来Flyway至少使用两个连接:一个用于锁定schema_version表,另一个用于实际运行修改...”
最后,我想知道Flyway如何支持SQLite。两个连接是必需的,但数据库最终被锁定。
然而,SQLite是官方支持的,我认为我搞砸了什么。
Flyway如何与SQLite兼容?