JPAでデータソースからコネクションを取得
環境
- Tomcat8
- PostgreSQL9.4
データソース設定
参考
Apache Tomcat 8 (8.0.28) - JNDI Datasource HOW-TO
JDBCドライバ配置
$CATALINA_HOME/lib にコピーしろって書いてあるけど、前エントリに書いたようにWEB-INF/libに置いている。Resource設定
ContextにResourceを設定する、のだがTomcatのcontextは数カ所配置できるので、どこに置けばいいのかよく分からなくなることがある。
Apache Tomcat 8 Configuration Reference (8.0.28) - The Context Container
context.xmlの配置について分かったこと. - 小さな星がほらひとつ
下側のページはTomcat6での情報だが、Tomcat8公式Doc(上側のページ)と照らし合わせると変わってはなさそう。
今回はwebアプリ内に/META-INF/context.xmlを作成して設定
<?xml version="1.0" encoding="UTF-8"?> <Context> <Resource name="jdbc/testSource" auth="Container" type="javax.sql.DataSource" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" maxActive="20" maxIdle="10" maxWait="-1" username="・・・" password="・・・" driverClassName="org.postgresql.Driver" url="jdbc:postgresql://127.0.0.1:5432/test" /> </Context>
前エントリの通りTomcat JDBCを使用。Commons DBCPを使うならfactoryを外す。
JPA(persistence.xml)設定
<persistence-unit name="testProvider" transaction-type="RESOURCE_LOCAL"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <non-jta-data-source>java:comp/env/jdbc/testSource</non-jta-data-source> <exclude-unlisted-classes>false</exclude-unlisted-classes> <properties> <!-- <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" /> <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://127.0.0.1:5432/test" /> <property name="javax.persistence.jdbc.user" value="・・・" /> <property name="javax.persistence.jdbc.password" value="・・・" /> --> </properties> </persistence-unit>
直接接続の設定(property)をコメントアウトして、代わりにnon-jta-data-sourceでデータソース名を指定。
TomcatでJNDIをlookupする際は「java:comp/env/」を付ける必要がある。
transaction-type="RESOURCE_LOCAL"なのでnon-jta-data-sourceタグを使用しているが、transaction-type="JTA"にする場合はjta-data-sourceタグを使う。