[SPRING] 다중 데이터 소스와 다중 세션 팩토리를 구성하는 최대 절전 모드
SPRING다중 데이터 소스와 다중 세션 팩토리를 구성하는 최대 절전 모드
나는 Spring과 Hibernate를 사용하고있다. Spring configuration은 아래와 같다. 어떻게하면 두 개의 데이터 소스 인 세션 팩토리를 구성 할 수 있습니까? 트랜잭션은 주석을 사용하여 관리됩니다. 제발 조언 해주세요.
<!-- we can use annotations -->
<context:annotation-config/>
<!-- package to look for annotated classes -->
<context:component-scan base-package="com.XXX.XXX.service.impl"/>
<!-- we will manage transactions with annotations -->
<tx:annotation-driven/>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- configure hibernate session factory -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close" p:driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
p:url="jdbc:sqlserver://DB_NAME\DB_INSTANCE:DB_PORT;databaseName=DB_NAME;username=DB_USER;password=DB_PASSWORD;" />
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
<prop key="hibernate.current_session_context_class">thread</prop>
<prop key="show_sql">false</prop>
</props>
</property>
</bean>
해결법
-
==============================
1.
<!-- configure hibernate session factory for FirstDB --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" p:driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" p:url="jdbc:sqlserver://${FirstDB_DB_HosName}\${FirstDB_DB_instanceName}:${FirstDB_DB_PortNumber};databaseName=${FirstDB_DB_DatabaseName};username=${FirstDB_DB_UserName};password=${FirstDB_DB_Password};" /> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation"> <value>classpath:hibernate.cfg.xml</value> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop> <prop key="hibernate.current_session_context_class">thread</prop> <prop key="show_sql">false</prop> </props> </property> </bean> <!-- configure hibernate session factory for SecondDB database --> <bean id="SecondDBdataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" p:driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" p:url="jdbc:sqlserver://${SecondDB_DB_HOST}\${SecondDB_DB_INSTANCE}:${SecondDB_DB_PORT};databaseName=${SecondDB_DB_DATABASENAME};username=${SecondDB_DB_USERNAME};password=${SecondDB_DB_PASSWORD};" /> <bean id="secondDBSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="SecondDBdataSource" /> <property name="configLocation"> <value>classpath:hibernate-SecondDB.cfg.xml</value> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop> <prop key="hibernate.current_session_context_class">thread</prop> <prop key="show_sql">false</prop> </props> </property> </bean>
Hibernate DAO에서 아래와 같이 @Qualifier 주석을 사용하여 2 개의 세션 팩토리를 연결할 수 있습니다
/** * Basic DAO operations dependent with Hibernate's specific classes * @see SessionFactory */ @Transactional(propagation= Propagation.REQUIRED, readOnly=false) public class HibernateDao<E, K extends Serializable> implements GenericDao<E, K> { @Autowired @Qualifier(value="sessionFactory") private SessionFactory sessionFactory; @Autowired @Qualifier(value="secondDBSessionFactory") private SessionFactory secondDBSessionFactory; protected Class<? extends E> daoType; public HibernateDao() { daoType = (Class<E>) ((ParameterizedType) getClass().getGenericSuperclass()) .getActualTypeArguments()[0]; } //Remaining Code }
-
==============================
2.내 프로젝트에서 간단한 구성을 보여줄 수 있습니다.
내 프로젝트에서 간단한 구성을 보여줄 수 있습니다.
<context:component-scan base-package="it.dommy.portmaga" /> <context:property-placeholder location="default.properties" /> <!-- Enable annotation style of managing transactions --> <tx:annotation-driven /> <context:annotation-config/> <bean id="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" > <property name="driverClass" value="${db.driverClassName}" /> <property name="jdbcUrl" value="${db.url}" /> <property name="user" value="${db.username}" /> <property name="password" value="${db.password}" /> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> <prop key="hibernate.format_sql">${hibernate.format_sql}</prop> <prop key="hibernate.hbm2ddl.auto">create-drop</prop> <!--<prop key="hibernate.use_sql_comments">${hibernate.use_sql_comments}</prop>--> <!--<prop key="hibernate.validator.apply_to_ddl">${hibernate.validator.apply_to_ddl}</prop>--> <!--<prop key="hibernate.max_fetch_depth">${hibernate.max_fetch_depth}</prop>--> <!--<prop key="hibernate.default_batch_fetch_size">${hibernate.default_batch_fetch_size}</prop>--> <!--<prop key="hibernate.jdbc.batch_size">${hibernate.jdbc.batch_size}</prop>--> <!--<prop key="hibernate.validator.autoregister_listeners">true</prop>--> <!-- This will drop our existing database and re-create a new one. --> </props> </property> <property name="packagesToScan"> <list> <value>it.dommy.portmaga.model.mysql</value> </list> </property> </bean> <bean id="secondDBdataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="${dba.driverClassName}" /> <property name="jdbcUrl" value="${dba.url}" /> <property name="user" value="${dba.username}" /> <property name="password" value="${dba.password}" /> </bean> <bean id="secondSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="secondDBdataSource" /> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">${hibernate.a.dialect}</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> </props> </property> <property name="packagesToScan"> <list> <value>it.dommy.portmaga.model.access</value> </list> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="secondSessionFactory" /> </bean>
모든 프로젝트가 여기에 표시되지 않으면 : https://bitbucket.org/dgabriele/portmaga
-
==============================
3.
<bean id="full-license-db-dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${db.driver}" /> <property name="url" value="${db.full.url}" /> <property name="username" value="${db.full.username}" /> <property name="password" value="${db.full.password}" /> </bean> <bean id="sessionFactoryFull" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="packagesToScan" value="ci.xyz.license.model.entity.full"/> <property name="dataSource" ref="full-license-db-dataSource" /> <property name="hibernateProperties"> <props> <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto} </prop> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> </props> </property> </bean> <bean id="trial-license-db-dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${db.driver}" /> <property name="url" value="${db.trial.url}" /> <property name="username" value="${db.trial.username}" /> <property name="password" value="${db.trial.password}" /> </bean> <bean id="sessionFactoryTrial" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="trial-license-db-dataSource" /> <property name="packagesToScan" value="ci.xyz.license.model.entity.trial"/> <property name="hibernateProperties"> <props> <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> </props> </property> </bean> <bean id="transactionManagerTrial" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactoryTrial" /> </bean> <bean id="transactionManagerFull" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactoryFull" /> </bean> <tx:annotation-driven transaction-manager="transactionManagerFull" /> <tx:annotation-driven transaction-manager="transactionManagerTrial" />
<filter> <filter-name>hibernateFilterTrial</filter-name> <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class> <init-param> <param-name>sessionFactoryBeanName</param-name> <param-value>sessionFactoryTrial</param-value> </init-param> </filter> <filter-mapping> <filter-name>hibernateFilterTrial</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping> <filter> <filter-name>hibernateFilterFull</filter-name> <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class> <init-param> <param-name>sessionFactoryBeanName</param-name> <param-value>sessionFactoryFull</param-value> </init-param> </filter> <filter-mapping> <filter-name>hibernateFilterFull</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping>
@저장소 @Scope (BeanDefinition.SCOPE_PROTOTYPE) public abstract class AbstractHibernateDao는 IBaseDao { 개인 정적 최종 로그 로거 = LogFactory.getLog (AbstractHibernateDao.class);
@Autowired protected SessionFactory sessionFactoryFull; @Autowired protected SessionFactory sessionFactoryTrial; protected Class<T> persistentClass;
from https://stackoverflow.com/questions/20541736/hibernate-configuring-multiple-datasources-and-multiple-session-factories by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 앱을 Spring Boot로 마이그레이션 한 후 Spring Data Rest를 사용하는 동안 @Id를 사용하는 엔티티 속성이 더 이상 JSON에 마샬링되지 않는다는 것을 관찰했다. (0) | 2018.12.10 |
---|---|
[SPRING] Spring 배치에서 여러 데이터 소스 사용 (0) | 2018.12.10 |
[SPRING] Java / Hibernate - 쓰기 작업은 읽기 전용 모드에서 허용되지 않습니다. (0) | 2018.12.10 |
[SPRING] 봄 - 코어 3.2.9 + 자바 8 (0) | 2018.12.10 |
[SPRING] 바람둥이가없는 스프링 부트 전쟁 (0) | 2018.12.10 |