자바왕보초
211
2021-11-24 15:44:15
2
96

[재업] 스프링에서 다중 datasource 설정 질문입니다.


서로 다른 스키마에서 가져온 정보로 하나의 mapper xml 안에서 조인을 하는 쿼리를 작성하려고 합니다.

 datasource와 sqlsession을 접속 정보의 수 만큼 나누고 동일한 매퍼 경로를 지정하였습니다.

문제는 쿼리 실행 시에 특정 스키마의 테이블을 인식하지 못하는 에러가 발생합니다. 

원칙적으로 하나의 mapper에 각기 다른 sqlsession으로 접근이 가능한지, 

가능 하다면 아래 소스에서 잘못된 부분을 알려주시면 감사하겠습니다. 


datasource 설정


<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
		<property name="url" value="jdbc:oracle:thin:@123.456.78.9:1121:orcl" />
		<property name="username" value="A"/>
		<property name="password" value="A"/>
</bean>
<bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
		<property name="url" value="jdbc:oracle:thin:@123.456.78.9:1121:orcl" />
		<property name="username" value="B"/>
		<property name="password" value="B"/>
	</bean>
<bean id="dataSource3" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
		<property name="url" value="jdbc:oracle:thin:@123.456.78.9:1121:orcl" />
		<property name="username" value="C"/>
		<property name="password" value="C"/>
</bean>

sqlsession 설정 


        <bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="configLocation" value="classpath:~~/sql-mapper-config.xml" />
		<property name="mapperLocations" value="classpath:/~~~/*/*.xml" />
	</bean>
	 
	<bean id="sqlSession2" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource2" />
		<property name="configLocation" value="classpath:~~/sql-mapper-config2.xml" />
		<property name="mapperLocations" value="classpath:/~~~/*/*.xml" />
	</bean>
	
	<bean id="sqlSession3" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource3" />
		<property name="configLocation" value="classpath:~~/sql-mapper-config3.xml" />
		<property name="mapperLocations" value="classpath:/~~~/*/*.xml" />
	</bean>
	
 	<bean class="egovframework.rte.psl.dataaccess.mapper.MapperConfigurer">
		<property name="basePackage" value="~~.*.mapper" />
	</bean>

0
  • 답변 2

  • ghkdwls30
    2k
    2021-11-24 15:52:43

    접근이야 가능하지만 서로다른 데이터소스가 디비링크나 특정조치없이 조인이된다?


    그리고 애초에 같은 서버인데 뭣하로 데이터소스를 나누시나요? 

  • kimdongy1000
    400
    2021-11-24 15:53:50

    문제는 쿼리 실행 시에 특정 스키마의 테이블을 인식하지 못하는 에러가 발생합니다 


    => 테이블 오너가 누구인지에 따라서 실행가능한 쿼리가 있고 불가능한 쿼리가 있습니다 


    예를 들어서 테이블 오너는 A 인데 B , C 가 A 테이블에 대한 접근 권한이 없다면 

    쿼리만드실때 테이블 오너를 명시를 해주세여 합니다 


    즉 

    A가 가진 테이블을 sample 테이블 이라고 합시다 


    같은 mapper 이기 때문에 

    A 도 Sample 테이블에 접근할때 SELECT * FROM Sample 로 접근할테고 

    B도 Sample 테이블도 접근할때 SELECT * FROM Sample 로 접근할테고 

    C도 Sample 테이블로 접근할때 SELECT * FROM Sample 로 접근할것입니다 


    이때는 자신이 오너인 Sample 테이블로 접근을 할려고 할것이고 이때 없으면 그냥 테이블이 없다고 나옵니다 


    즉 A테이블의 Sample 테이블에 접근을 할려면 B , C 에 롤을 주시던지 

    B , C 가 접근할때는 SELECT * FROM A.Sample 로 해주셔야 합니다 


    글이 길어서 요약을 하자면

    오너가 다른 테이블에 접근할려면  [오너].[테이블명] 로 접근을 하시는 방법 

    그게 아니라면 접근할려는 대상들에 대한 접근 Role을 주셔야 합니다 

  • 로그인을 하시면 답변을 등록할 수 있습니다.