복붙노트

[SPRING] persistence.xml과 스프링 설정 파일의 데이터 소스 설정의 차이점

SPRING

persistence.xml과 스프링 설정 파일의 데이터 소스 설정의 차이점

두 가지 방법으로 데이터 소스 구성을 보았습니다 (아래 코드는 데모 용입니다).

1) 퍼시스턴스 유닛 내부의 설정 :

<persistence-unit name="LocalDB" transaction-type="RESOURCE_LOCAL">
    <class>domain.User</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
        <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
        <property name="hibernate.connection.url" value="jdbc:hsqldb:hsql://localhost"/>
        <property name="hibernate.hbm2ddl.auto" value="create"/>
        <property name="hibernate.c3p0.min_size" value="5"/>
        ....
        <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
    </properties>
</persistence-unit>

Spring 구성 파일 (예 : applicationContext.xml) 내의 2) 구성

<bean id="domainEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="JiraManager"/>
    <property name="dataSource" ref="domainDataSource"/>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="generateDdl" value="false"/>
            <property name="showSql" value="false"/>
            <property name="databasePlatform" value="${hibernate.dialect}"/>
        </bean>
    </property>
</bean>

<bean id="domainDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="${db.driver}" />
    <property name="jdbcUrl" value="${datasource.url}" />
    <property name="user" value="${datasource.username}" />
    <property name="password" value="${datasource.password}" />
    <property name="initialPoolSize" value="5"/>
    <property name="minPoolSize" value="5"/>
    .....
</bean>

문제는 : 각 방법마다 장단점이 있는가, 아니면 단지 맛의 문제일까요?

해결법

  1. ==============================

    1.JavaEE 컨테이너에 있으면 커다란 차이가 있습니다.

    JavaEE 컨테이너에 있으면 커다란 차이가 있습니다.

    개인적인 취향보다는 두 번째 접근 방식을 약간 수정하면 훨씬 나아질 수 있습니다.

    첫 번째 경우에는 자체 연결 풀을 만들고 컨테이너의 기존 연결 풀에서 이익을 얻지 못합니다. 따라서 컨테이너에 최대 20 개의 데이터베이스 동시 연결을 구성하더라도이 새로운 연결 풀이 구성에 의해 제한되지 않으므로이 최대 값을 보장 할 수 없습니다. 또한 컨테이너가 제공하는 모니터링 도구로 이익을 얻지 못할 수도 있습니다.

    두 번째 경우에는 위와 동일한 단점을 가지고 자체 연결 풀을 만들 수도 있습니다. 그러나이 스프링 빈의 정의를 분리하여 테스트 실행에만 사용할 수 있습니다.

    가장 좋은 방법은 JNDI를 통해 컨테이너의 연결 풀을 찾는 것입니다. 그런 다음 컨테이너에서 데이터 소스 구성을 존중해야합니다.

    <!-- datasource-test.xml -->
    <bean id="domainDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
       <property name="driverClass" value="${db.driver}" />
       <property name="jdbcUrl" value="${datasource.url}" />
       <property name="user" value="${datasource.username}" />
       <property name="password" value="${datasource.password}" />
       <property name="initialPoolSize" value="5"/>
       <property name="minPoolSize" value="5"/>
    .....
    </bean>
    
    <!-- datasource.xml -->
    <jee:jndi-lookup id="domainDataSource" jndi-lookup="jndi/MyDataSource" />
    
  2. ==============================

    2.엄격하게 개인적인 취향입니다.

    엄격하게 개인적인 취향입니다.

    Spring을 이미 사용하고 있다면 Spring의 설정을 사용하는 것이 좋습니다. 그 목적은 의존성 삽입 및 관리이므로 데이터베이스에 대한 의존성과 관련하여 작업을 수행하게하십시오. 그러나 아직 Spring을 사용하고 있지 않다면, 영속성 설정을 유지하면 프로젝트가 여전히 단순하면서도 기능적으로 유지됩니다. 나는 Hibernate가 데이터베이스와 상호 작용할 필요가있는 프로젝트가 아마도 Spring을 사용하기에 충분히 크다고 제안 할 것이다.

  3. from https://stackoverflow.com/questions/3111992/difference-between-configuring-data-source-in-persistence-xml-and-in-spring-conf by cc-by-sa and MIT license