6.9. Java™ 지속성 API로 데이터 소스 사용
트랜잭션 관리 관점에서 JPA(Java™ Persistence API)와 함께 데이터 소스를 사용하는 방법을 이해하는 것이 중요합니다. 이 섹션에서는 JPA 사양 자체의 세부 정보 또는 가장 알려진 JPA 구현인 Hibernate에 대한 세부 정보를 설명하지 않습니다. 대신 이 섹션에서는 JPA 영구 단위를 데이터 소스에 가리키는 방법을 보여줍니다.
6.9.1. 데이터 소스 참조 정보
META-INF/persistence.xml
설명자( JPA 2.1 사양 참조, 8.2.1.5 jta-data-source, non-jta-data-source)는 다음 두 가지 종류의 데이터 소스 참조를 정의합니다.
-
<JTA-data-source
> -JTA
트랜잭션과 함께 사용할 JTA 사용 데이터 소스에 대한 JNDI 참조입니다. -
<non-jta-data-source
> - JTA 트랜잭션 외부에서 사용할JTA
사용 데이터 소스에 대한 JNDI 참조입니다. 이 데이터 소스는 일반적으로 초기화 단계에서도 사용됩니다. 예를 들어, Hibernate를 자동 생성 데이터베이스 스키마로 구성하는hibernate.hbm2ddl.auto
속성도 사용됩니다.
이 두 데이터 소스는 javax.sql.DataSource
또는 javax.sql.XADataSource
와 관련이 없습니다! 이는 JPA 애플리케이션을 개발할 때 일반적으로 잘못된 오류입니다. 두 JNDI 이름은 모두 JNDI 바인딩된 javax.sql.DataSource
서비스를 참조해야 합니다.
6.9.2. JNDI 이름 참조
osgi.jndi.service.name
속성에 OSGi 서비스를 등록하면 OSGi JNDI 서비스에 바인딩 됩니다. OSGi 런타임(예: Fuse/Karaf)에서 JNDI는 이름
다음 목록에서는 새로운 Fuse 설치에서 JNDI에 데이터 소스를 등록하는 방법을 보여줍니다.
karaf@root()> install -s mvn:mysql/mysql-connector-java/5.1.34 Bundle ID: 223 karaf@root()> install -s mvn:org.osgi/org.osgi.service.jdbc/1.0.0 Bundle ID: 224 karaf@root()> install -s mvn:org.ops4j.pax.jdbc/pax-jdbc-mysql/1.3.0 Bundle ID: 225 karaf@root()> install -s mvn:org.ops4j.pax.jdbc/pax-jdbc/1.3.0 Bundle ID: 226 karaf@root()> install -s mvn:org.ops4j.pax.jdbc/pax-jdbc-pool-common/1.3.0 Bundle ID: 227 karaf@root()> install -s mvn:org.ops4j.pax.jdbc/pax-jdbc-config/1.3.0 Bundle ID: 228 karaf@root()> config:edit --factory --alias mysql org.ops4j.datasource karaf@root()> config:property-set osgi.jdbc.driver.name mysql karaf@root()> config:property-set dataSourceName mysqlds karaf@root()> config:property-set osgi.jndi.service.name jdbc/mysqlds karaf@root()> config:property-set dataSourceType DataSource karaf@root()> config:property-set jdbc.url jdbc:mysql://localhost:3306/reportdb karaf@root()> config:property-set jdbc.user fuse karaf@root()> config:property-set jdbc.password fuse karaf@root()> config:property-set jdbc.useSSL false karaf@root()> config:update karaf@root()> feature:install jndi karaf@root()> jndi:names JNDI Name │ Class Name ──────────────────────────┼─────────────────────────────────────────────── osgi:service/jndi │ org.apache.karaf.jndi.internal.JndiServiceImpl osgi:service/jdbc/mysqlds │ com.mysql.jdbc.jdbc2.optional.MysqlDataSource
표시된 대로 데이터 소스는 osgi:service/jdbc/mysqlds
JNDI 이름에서 사용할 수 있습니다.
그러나 OSGi에서 JPA의 경우 전체 JNDI 이름을 사용해야 합니다. 다음은 데이터 소스 참조를 지정하는 샘플 META-INF/persistence.xml
조각입니다.
<jta-data-source> osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/mysqlds) </jta-data-source> <non-jta-data-source> osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/mysqlds) </non-jta-data-source>
위의 구성이 없으면 다음과 같은 오류가 발생할 수 있습니다.
Persistence unit "pu-name" refers to a non OSGi service DataSource