on
[Spring boot] 데이터베이스 멀티 커넥션
[Spring boot] 데이터베이스 멀티 커넥션
728x90
반응형
한프로젝트에 postgressql과 oracle 데이터베이스를 동시에 쓰고싶을때 사용하는 방법입니다.
application-properties
#Oracle spring.oracle.datasource.hikari.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy spring.oracle.datasource.hikari.jdbc-url=jdbc:log4jdbc:oracle:thin:@ip주소:port번호:데이터베이스이름 spring.oracle.datasource.hikari.username=아이디 spring.oracle.datasource.hikari.password=패스워드 spring.oracle.datasource.hikari.maximum-pool-size=50 # postgresql spring.postgres.datasource.hikari.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy spring.postgres.datasource.hikari.jdbc-url=jdbc:log4jdbc:postgresql://ip주소:port번호/데이터베이스이름 spring.postgres.datasource.hikari.username=아이디 spring.postgres.datasource.hikari.password=패스워드 spring.postgres.datasource.hikari.maximum-pool-size=10
OracleConnMapper.java
package com.hy.orderSystem.config.oracle; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.stereotype.Component; @Target({ ElementType.TYPE }) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface OracleConnMapper { String value() default ""; }
OracleDatabaseConfig.java
package com.hy.orderSystem.config.oracle; import javax.sql.DataSource; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import com.hy.orderSystem.common.Constants; import com.zaxxer.hikari.HikariDataSource; @Configuration @MapperScan(value = "dao 파일이있는 패키지이름", annotationClass = OracleConnMapper.class, sqlSessionFactoryRef = "oracleSqlSessionFactory") @EnableTransactionManagement public class OracleDatabaseConfig { @Bean(name = "oracleDataSource", destroyMethod = "close") @Primary @ConfigurationProperties(prefix = "spring.oracle.datasource.hikari") public DataSource oracleDataSource() { return DataSourceBuilder.create().type(HikariDataSource.class).build(); } @Bean(name = "oracleSqlSessionFactory") @Primary public SqlSessionFactory oracleSqlSessionFactory(@Qualifier("oracleDataSource") DataSource oracleDataSource, ApplicationContext applicationContext) throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(oracleDataSource); sqlSessionFactoryBean.setMapperLocations(applicationContext.getResources("classpath*:mapper/oracle/*.xml")); sqlSessionFactoryBean.setTypeAliasesPackage(Constants.APP_TYPE_ALIASES_PACKAGE); return sqlSessionFactoryBean.getObject(); } @Bean(name = "oracleSqlSessionTemplate") @Primary public SqlSessionTemplate oracleSqlSessionTemplate(SqlSessionFactory oracleSqlSessionFactory) throws Exception { return new SqlSessionTemplate(oracleSqlSessionFactory); } @Bean(name = "oracleTm") public PlatformTransactionManager oracleTransactionManager() { return new DataSourceTransactionManager(oracleDataSource()); } }
PostgresConnMapper
package com.hy.orderSystem.config.postgress; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.stereotype.Component; @Target({ ElementType.TYPE }) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface PostgresConnMapper { String value() default ""; }
package com.hy.orderSystem.config.postgress; import javax.sql.DataSource; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import com.hy.orderSystem.common.Constants; import com.zaxxer.hikari.HikariDataSource; @Configuration @MapperScan(value = "dao 파일이있는 패키지이름", annotationClass = PostgresConnMapper.class, sqlSessionFactoryRef = "postgresSqlSessionFactory") @EnableTransactionManagement public class PostgresDatabaseConfig { @Bean(name = "postgresDataSource", destroyMethod = "close") @ConfigurationProperties(prefix = "spring.postgres.datasource.hikari") public DataSource postgresDataSource() { return DataSourceBuilder.create().type(HikariDataSource.class).build(); } @Bean(name = "postgresSqlSessionFactory") public SqlSessionFactory postgresSqlSessionFactory(@Qualifier("postgresDataSource") DataSource postgresDataSource, ApplicationContext applicationContext) throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(postgresDataSource); sqlSessionFactoryBean.setMapperLocations(applicationContext.getResources("classpath*:mapper/postgress/*.xml")); sqlSessionFactoryBean.setTypeAliasesPackage(Constants.APP_TYPE_ALIASES_PACKAGE); return sqlSessionFactoryBean.getObject(); } @Bean(name = "postgresSqlSessionTemplate") public SqlSessionTemplate postgresSqlSessionTemplate(SqlSessionFactory postgresSqlSessionFactory) throws Exception { return new SqlSessionTemplate(postgresSqlSessionFactory); } @Bean(name = "postgresTm") public PlatformTransactionManager postgresTransactionManager() { return new DataSourceTransactionManager(postgresDataSource()); } }
classpath -> resource를 나타내므로 xml의 경로를 적어주면 됩니다.
해당 데이터베이스 멀티커넥션을 하였을경우 @transactional을 사용할때는 이름을 지어서 사용해야 합니다.
@Transactional로 사용하면 동일한 이름의 transactional을 사용한다는 오류가 발생이 됩니다.
oracle일경우에는 @Transactional(value = "oracleTm")
postgres일경우에는 @Transactional(value = "postgresTm")
728x90
반응형
from http://aamoos.tistory.com/506 by ccl(A) rewrite - 2021-11-24 17:00:58