【问题标题】:Spring boot connect with multiple schemas in mysqlSpring Boot 与 mysql 中的多个模式连接
【发布时间】:2018-04-19 10:01:41
【问题描述】:

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

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

没有选择数据库

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

【问题讨论】:

    标签: spring spring-boot jdbc


    【解决方案1】:

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

    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
    

    【讨论】:

    • 我不必对 spring 4.0 做任何事情,xml 配置也必须是在 spring boot 中做同样的事情,寻找解决方案。
    • 这是仅链接的答案。请详细说明。
    【解决方案2】:

    这是您可以使用的代码:

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

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

    【讨论】:

    • 这对我很感兴趣。如果我理解正确,我可以连接到 500 个数据库,而我的属性文件中没有 500 个连接参数?
    【解决方案3】:

    之所以说“未选择数据库”是因为您在端口号后面加上了正斜杠。这应该工作......

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

    希望这对某人有所帮助。

    【讨论】:

    • 但是,如果 diff 架构有 diff 用户名、密码,如何处理?
    猜你喜欢
    • 1970-01-01
    • 2021-10-23
    • 2017-11-13
    • 2018-09-06
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    相关资源
    最近更新 更多