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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring启动连接mysql中的多个模式相关的知识,希望对你有一定的参考价值。

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

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

没有选择数据库

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

答案

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

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定义中。

希望这有助于某人。

另一答案

您可以在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
另一答案

这是您可以使用的代码:

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;
}

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

以上是关于Spring启动连接mysql中的多个模式的主要内容,如果未能解决你的问题,请参考以下文章

Spring批量启动多个数据源多个模式

启动Spring后,连接mysql报错

scrapy按顺序启动多个爬虫代码片段(python3)

是否有在单个活动中处理多个片段的 Android 设计模式?

kotlin-从一个片段更改多个片段的小数位

解决spring-boot启动中碰到的问题:Cannot determine embedded database driver class for database type NONE(转)(代码片段