package com.myoa.engineering.crawl.ppomppu.processor.configuration; import com.myoa.engineering.crawl.ppomppu.processor.configuration.properties.DatasourceProperties; import com.myoa.engineering.crawl.ppomppu.processor.configuration.properties.DatasourceProperties.DataSourcePropertiesUnit; import com.myoa.engineering.crawl.ppomppu.processor.configuration.properties.HibernateProperties; import com.myoa.engineering.crawl.ppomppu.processor.configuration.properties.HikariProperties; import com.myoa.engineering.crawl.ppomppu.processor.domain.BaseScanDomain; import com.myoa.engineering.crawl.ppomppu.processor.infrastructure.repository.BaseScanRepository; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.Properties; import javax.persistence.EntityManagerFactory; import javax.sql.DataSource; import lombok.NonNull; import org.hibernate.cfg.AvailableSettings; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.transaction.PlatformTransactionManager; @Configuration @EnableJpaRepositories(basePackageClasses = BaseScanRepository.class, entityManagerFactoryRef = "ppomppuNotifierProcessorEntityManagerFactory", transactionManagerRef = "ppomppuNotifierProcessorTransactionManager" ) public class PpomppuDatasourceConfiguration { private static final String DATA_SOURCE_UNIT_NAME = "ppomppu"; private final DatasourceProperties dataSourceProeprties; private final HikariProperties hikariProperties; private final HibernateProperties hibernateProperties; public PpomppuDatasourceConfiguration(DatasourceProperties dataSourceProeprties, HikariProperties hikariProperties, HibernateProperties hibernateProperties) { this.dataSourceProeprties = dataSourceProeprties; this.hikariProperties = hikariProperties; this.hibernateProperties = hibernateProperties; } @Bean(name = "ppomppuNotifierProcessorDataSource") public DataSource dataSource() { DataSourcePropertiesUnit dataSourcePropertiesUnit = dataSourceProeprties.find(DATA_SOURCE_UNIT_NAME); final HikariConfig hikariConfig = new HikariConfig(); hikariConfig.setJdbcUrl(dataSourcePropertiesUnit.toCompletedJdbcUrl()); hikariConfig.setUsername("sa"); hikariConfig.setPassword("sa"); hikariConfig.setAutoCommit(hikariProperties.getAutoCommit()); hikariConfig.setMaximumPoolSize(hikariProperties.getMaximumPoolSize()); hikariConfig.setMinimumIdle(hikariProperties.getMinimumIdle()); if (hikariProperties.getMaximumPoolSize() > hikariProperties.getMinimumIdle()) { hikariConfig.setIdleTimeout(hikariProperties.getIdleTimeout()); } hikariConfig.setValidationTimeout(hikariProperties.getValidationTimeout()); hikariConfig.setConnectionTimeout(hikariProperties.getConnectionTimeout()); hikariConfig.setMaxLifetime(hikariProperties.getMaxLifetime()); final DataSource dataSource = new HikariDataSource(hikariConfig); return dataSource; } @Bean("ppomppuNotifierProcessorEntityManagerFactory") public LocalContainerEntityManagerFactoryBean entityManagerFactory( EntityManagerFactoryBuilder builder, @Qualifier("ppomppuNotifierProcessorDataSource") DataSource dataSource) { return builder.dataSource(dataSource) .packages(BaseScanDomain.class) .properties(getPropsMap(DATA_SOURCE_UNIT_NAME)) .build(); } @Bean("ppomppuNotifierProcessorTransactionManager") public PlatformTransactionManager transactionManager( @Qualifier("ppomppuNotifierProcessorEntityManagerFactory") EntityManagerFactory entityManagerFactory) { return new JpaTransactionManager(entityManagerFactory); } public static Properties getProps(@NonNull HibernateProperties.HibernatePropertiesUnit hibernateProperties) { Properties properties = new Properties(); properties.put(AvailableSettings.DIALECT, hibernateProperties.getDialect()); properties.put(AvailableSettings.FORMAT_SQL, hibernateProperties.getFormatSql()); properties.put(AvailableSettings.SHOW_SQL, hibernateProperties.getShowSql()); properties.put(AvailableSettings.HBM2DDL_AUTO, hibernateProperties.getHbm2ddlAuto()); properties.put(AvailableSettings.CONNECTION_PROVIDER_DISABLES_AUTOCOMMIT, hibernateProperties.getDisableAutoCommit()); properties.put(AvailableSettings.IMPLICIT_NAMING_STRATEGY, "org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy"); properties.put(AvailableSettings.PHYSICAL_NAMING_STRATEGY, "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy"); properties.put(AvailableSettings.GENERATE_STATISTICS, "false"); properties.put(AvailableSettings.GLOBALLY_QUOTED_IDENTIFIERS, "true"); properties.put(AvailableSettings.GLOBALLY_QUOTED_IDENTIFIERS_SKIP_COLUMN_DEFINITIONS, "true"); properties.put(AvailableSettings.STATEMENT_BATCH_SIZE, "20"); properties.put(AvailableSettings.ORDER_INSERTS, "true"); properties.put(AvailableSettings.ORDER_UPDATES, "true"); properties.put(AvailableSettings.BATCH_VERSIONED_DATA, "true"); properties.put(AvailableSettings.USE_NEW_ID_GENERATOR_MAPPINGS, "false"); return properties; } public Map getPropsMap(@NonNull String unitName) { return convertPropertiestoMaps(getProps(hibernateProperties.find(unitName))); } public Map convertPropertiestoMaps(Properties properties) { Map propertiesMap = new HashMap<>(); for (Enumeration e = properties.propertyNames(); e.hasMoreElements(); ) { String key = (String) e.nextElement(); propertiesMap.put(key, properties.getProperty(key)); } return propertiesMap; } }