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

Tur*_*erd 7 mysql jdbc maven 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我在跟踪中得到了以下错误

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
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我为什么MySQL的DataSource没有连接.谢谢!

小智 5

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

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

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

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

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