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

时间:2014-08-07 15:25:04

标签: mysql maven jdbc flyway

我正在尝试使用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是我存储数据库信息的文件,密码可以为null

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没有连接。谢谢!

3 个答案:

答案 0 :(得分:5)

看起来Flyway无法连接到数据库。

这样做的一个原因是数据库URL中的数据库不存在。

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

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

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

答案 1 :(得分:0)

进入同样的问题。显然,问题在于我的.properties文件。罐子用的是用它包装的,而不是外用的。所以我将外部属性文件移出了资源文件夹并进入了jar的根目录,问题解决了! 希望这有助于某人。

答案 2 :(得分:0)

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

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

线程“ main”中的异常org.flywaydb.core.api.FlywayException:无法从数据源获取Jdbc连接

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

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

这就是我想出的结果

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

对我来说,解决方案是修改与应用程序一起包装的内部定义的数据库连接字符串,或使用与我的{{1}中与应用程序一起包装的内部定义的数据库连接字符串}文件。

仅此而已。

我希望这对您有帮助