Flyway迁移,无法从DataSource获取Jdbc连接

Posted

技术标签:

【中文标题】Flyway迁移,无法从DataSource获取Jdbc连接【英文标题】:Flyway migration, Unable to obtain Jdbc connection from DataSource 【发布时间】:2014-09-30 22:06:18 【问题描述】:

我正在尝试使用 flyway 创建和管理 mysql 数据库。这是我目前得到的代码。

FlywayMigration.java : 应用迁移的类

public class FlywayMigration

    public FlywayMigration(DatabaseConfiguration configuration, Flyway flyway)
    
        flyway.setDataSource(configuration.getDataSource());
        flyway.migrate();
    

    public static void main(String[] args)
    
        new FlywayMigration(new DatabaseConfiguration("database.properties"), new Flyway());
    

DatabaseConfiguration.java : 配置类,该类将配置要应用到 Flyway.setDataSource 方法的数据源

public class DatabaseConfiguration

    private final Logger LOGGER = LoggerFactory.getLogger(this.getClass());

    private PropertiesUtil prop = null;

    public DatabaseConfiguration(String file)
    
        prop = new PropertiesUtil(file);
    

    public String getDataSourceClass()
    
        return prop.getProperty("mysql.data.source.class");
    

    public String getURL ()
    
        return prop.getProperty("mysql.url");
    

    public String getHostName()
    
        return prop.getProperty("mysql.host.name");
    

    public String getDatabaseName()
    
        return prop.getProperty("mysql.database.name");
    

    public DataSource getDataSource()
    
        MysqlDataSource dataSource = new MysqlDataSource();
        dataSource.setURL(getURL());
        dataSource.setUser(prop.getProperty("mysql.user.name"));
        dataSource.setPassword(null);
        return dataSource;
    

database.properties 是我存储数据库信息的文件,密码可以为空

mysql.data.source.class=com.mysql.jdbc.Driver    
mysql.url=jdbc:mysql://localhost:3306/vmrDB    
mysql.host.name=localhost    
mysql.database.name=vmrDB    
mysql.user.name=root

我的跟踪中出现以下错误

Exception in thread "main" 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:1144)
    at org.flywaydb.core.Flyway.migrate(Flyway.java:811)
    at com.bt.sitb.vmr.migration.FlywayMigration.<init>(FlywayMigration.java:10)
    at com.bt.sitb.vmr.migration.FlywayMigration.main(FlywayMigration.java:15)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

谁能告诉我为什么 MySQL 的 DataSource 没有连接。谢谢!

【问题讨论】:

【参考方案1】:

Flyway 似乎无法连接到数据库。

其中一个原因是数据库 URL 中的数据库不存在。

问题:您的数据库架构是否存在?

如果你的答案是否定的,那么:

连接到 jdbc:mysql://localhost:3306/mysql 还使用flyway.setSchemas(configuration.getDatabaseName()) 指定用于迁移的架构 您还需要 flyway.init() 才能初始化数据库迁移。

【讨论】:

使用 ninja framework + flyway 遇到了这个问题。连接到 AWS RDS 实例时必须附加 /postgres【参考方案2】:

遇到了同样的问题。显然,问题出在我的.properties 文件上。罐子使用的是与它一起包装的罐子,而不是外部罐子。所以我将我的外部属性文件从资源文件夹中移到了 jar 的根目录中,问题就解决了! 希望这可以帮助某人。

【讨论】:

【参考方案3】:

在使用 Tomcat 应用程序服务器在 Debian 10 中处理 Java 应用程序时,我遇到了同样的问题。

我在 context.xml 文件中定义了数据库的连接字符串,但是,当我启动应用程序并尝试登录应用程序时,我得到了错误:

线程 "main" org.flywaydb.core.api.FlywayException 中的异常:无法从 DataSource 获取 Jdbc 连接

在 org.flywaydb.core.internal.util.jdbc.JdbcUtils.openConnection(JdbcUtils.java:56)

在 org.flywaydb.core.Flyway.execute(Flyway.java:1144)

这是我的发现

我终于意识到该应用程序正在使用与它一起打包的内部定义的数据库连接字符串。内部定义的数据库连接字符串与我自己在context.xml 文件中定义的数据库连接字符串不同。

我的解决方案是修改与应用程序一起打包的内部定义的数据库连接字符串,或者使用与我的context.xml 文件中的应用程序一起打包的相同内部定义的数据库连接字符串.

就是这样。

我希望这会有所帮助

【讨论】:

以上是关于Flyway迁移,无法从DataSource获取Jdbc连接的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Flyway 迁移名称中删除前缀?

如何从 IntelliJ IDEA 中的模型类生成 Flyway 迁移脚本?

flyway mysqldump迁移

Flyway 迁移无法识别 beforeValidate.sql

无法为 PostgreSQL 表应用 Flyway 迁移

无法在 Spring Boot 中将 Flyway 迁移与 postgresQL 连接起来