#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. Упомянутые вами классы имеют разные полные имена, но могут быть и другие, которые имеют общее имя. Как правило, не стоит пытаться загрузить обе зависимости в одну и ту же программу.