Использование двух идентичных зависимостей с разными версиями mysql

#java #mysql #hibernate #maven #hikaricp

#java #mysql #спящий режим #maven #hikaricp

Вопрос:

Моему приложению необходимо подключиться к двум разным базам данных, первая версия базы данных — 5, вторая версия базы данных — 8. Вопрос: как мне зарегистрировать зависимости maven и как мне правильно использовать hikaricp?

мой pom.xml

 <dependency>
    <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.21</version>
    </dependency>
    <dependency>
        <groupId>mysql.</groupId>
        <artifactId>mysql-connector-java</artifactId>
    <version>5.1.49</version>
</dependency>
  

после этого я вижу, что maven загрузил две версии драйверов.

Hibernate SessionFactory

 protected SessionFactory buildSessionFactory( List<Class> classes ) {
    StandardServiceRegistry        registry        = null;
    StandardServiceRegistryBuilder registryBuilder = new StandardServiceRegistryBuilder();

    try {
        registry = registryBuilder.applySettings( this.buildSettings() ).build();
        MetadataSources metadataSources = new MetadataSources( registry );
        for ( Class aClass : classes ) {
            metadataSources.addAnnotatedClass( aClass );
        }
        Metadata metadata = metadataSources.getMetadataBuilder().build();
        return metadata.getSessionFactoryBuilder().build();
    }
    catch ( Exception e ) {
        if ( registry != null ) StandardServiceRegistryBuilder.destroy( registry );
        System.err.println( "Initial SessionFactory creation failed."   e );
        throw new ExceptionInInitializerError( e );
    }
}
private Map<String, Object> buildSettings() {
    Map<String, Object> settings = new HashMap<>();
    settings.put( Environment.DRIVER, dbModel.getDriver() );
    settings.put( Environment.DIALECT, dbModel.getDialect() );
    settings.put( Environment.URL, dbModel.getUrl() );
    settings.put( Environment.USER, dbModel.getUser() );
    settings.put( Environment.PASS, dbModel.getSecret() );
    settings.put( Environment.SHOW_SQL, dbModel.getShowSql() );
    settings.put( Environment.ENABLE_LAZY_LOAD_NO_TRANS, dbModel.getLazyLoad() );

    settings.put( "hibernate.hikari.connectionTimeout", dbModel.getConnectionTimeout() );
    settings.put( "hibernate.hikari.idleTimeout", dbModel.getIdleTimeout() );
    settings.put( "hibernate.hikari.maxLifetime", dbModel.getMaxLifetime() );
    settings.put( "hibernate.hikari.autoCommit", dbModel.getAutoCommit() );
    settings.put( "hibernate.hikari.minimumIdle", dbModel.getMinimumIdle() );
    settings.put( "hibernate.hikari.maximumPoolSize", dbModel.getMaxPoolSize() );
    settings.put( "hibernate.hikari.registerMbeans", dbModel.getRegisterMbean() );

    return settings;
}
  

при отладке я вижу, что переменной hibernate.connection.driver_class присвоено значение com.mysql.jdbc.Driver
введите описание изображения здесь

но при сборке я вижу ошибку ошибка

Что я делаю не так?

Комментарии:

1. Вероятно, это опечатка: <groupId>mysql.</groupId> (точка в конце mysql).

2. Нет, Фабиан, это не опечатка. Если зависимость mysql указана без точки в файле pom, то загружается версия 5 драйвера mysql или та, которая указана последней в файле pom. и я не утверждаю, что это решение <groupId>mysql.</groupId> правильное, я просто нашел это решение где-то в Интернете.

3. Вы имеете в виду, что вы изменили groupId артефакта с mysql на mysql. ? Со стороны Maven это позволяет загружать оба, но разве они все еще не перекрываются в классах? Я имею в виду, что если обе версии 5 и 8 имеют классы с одинаковым полным именем, то загрузка обоих обычно приводит к проблемам.

4. Если я вас правильно понимаю, то MySQL версии 5 имеет имя класса = com.mysql.jdbc.Driver , а mysql версии 8 имеет имя класса = com.mysql.cj.jdbc.Driver . При сборке я StandardServiceRegistryBuilder добавляю строку Environment.DRIVER = com.mysql.jdbc.Driver в HashMap ().

5. Упомянутые вами классы имеют разные полные имена, но могут быть и другие, которые имеют общее имя. Как правило, не стоит пытаться загрузить обе зависимости в одну и ту же программу.