Spring启动连接mysql中的多个模式

时间:2017-11-07 05:23:47

标签: spring spring-boot jdbc

我无法配置如何使用spring boot连接多个模式。 到目前为止,使用 spring 4 XML配置,我只能将数据库URL放在:jdbc:mysql://180.179.57.114:3306/?zeroDateTimeBehavior=convertToNull中,并在实体类中指定要使用的模式,从而能够连接到多个模式。

然而,使用Spring Boot,我无法实现同样的目标。 如果在 application.properties 中我只指定了没有架构的JDBC URL,则会出错:

  

未选择数据库

即使我在实体类中指定了模式名称。 请建议我如何在Spring Boot中实现相同的功能?感谢。

3 个答案:

答案 0 :(得分:4)

它之所以说“没有选择数据库”是因为你在端口号之后放了正斜杠。这应该有用......

jdbc:mysql://180.179.57.114:3306?zeroDateTimeBehavior=convertToNull

我花了很多时间让Hibernate使用一个MySQL实例和多个模式。

我最终将我的连接指定为:

jdbc:mysql://localhost:3306/schema1?useSSL=false&useUnicode=yes&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull

我的实体为:

@Entity    
@Table(name="table1", schema="schema1", catalog="schema1")
public class Table1 {
   @Id
   private int id;
}

@Entity
@Table(name="table2", schema="schema2", catalog="schema2")
public class Table2 {
   @Id
   private int id;
}

显然,JDBC将MySQL模式视为目录。我在没有指定模式的情况下尝试了上述操作,但是对于集成测试,我使用HSQL,因此我将模式保留在@Table定义中。

希望这有助于某人。

答案 1 :(得分:1)

您可以在application.properties文件中配置多个数据源,并在实体类中使用approapriate数据源。 因为,示例示例已经在下面提到的链接中,我直接指向相同的。 请参阅以下链接并检查它是否解决了您的问题:

https://www.ccampo.me/java/spring/2016/02/13/multi-datasource-spring-boot.html

基本上它指定的是你可以配置多个数据源并在你的实体中指定所需的数据源

#first db
spring.datasource.url = [url]
spring.datasource.username = [username]
spring.datasource.password = [password]
spring.datasource.driverClassName = oracle.jdbc.OracleDriver

#second db ...
spring.secondDatasource.url = [url]
spring.secondDatasource.username = [username]
spring.secondDatasource.password = [password]
spring.secondDatasource.driverClassName = oracle.jdbc.OracleDriver

答案 2 :(得分:0)

以下是您可以使用的代码:

public static SessionFactory buildSessionFactory(DatabaseData dbData) {
    SessionFactory sessionFactory = null;
    try {

        if (dbData != null) {

            DriverManagerDataSource dataSource = new DriverManagerDataSource();
            dataSource.setDriverClassName(dbData.getDataSourceDriver());
            dataSource.setUrl("jdbc:mysql://" + dbData.getDatabaseIP() + ":" + dbData.getDatabasePort() + "/" + dbData.getDatabaseSchema()
                    + "?autoReconnect=true&useSSL=false");
            dataSource.setUsername(dbData.getDatabaseUserName());
            dataSource.setPassword(dbData.getDatabasePassword());

            LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
            sessionFactoryBean.setDataSource(dataSource);

            Properties hibernateProperties = new Properties();

            hibernateProperties.put("hibernate.show_sql", false);

            sessionFactoryBean.setHibernateProperties(hibernateProperties);
            sessionFactoryBean.setPackagesToScan("com.***.***.entity");
            sessionFactoryBean.afterPropertiesSet();
            return sessionFactoryBean.getObject();
        }
    } catch (Exception ex) {
        logger.error("Initial SessionFactory creation failed.", ex);
        ex.printStackTrace();
        throw new ExceptionInInitializerError(ex);
    }
    return sessionFactory;
}

其中,DatabaseData类指定如下:

@Data
public class DatabaseData {

    private String databaseIP;
    private String databasePort;
    private String databaseName;
    private String databaseSchema;
    private String databaseUserName;
    private String databasePassword;
    private String dataSourceDriver;
    private int timeout;
}

对于数据库中的每个模式,您可以通过从属性文件或任何其他程序中读取属性来创建此类的对象。 我希望这能解决你的问题。