JPAでデータソースからコネクションを取得

環境

  • Tomcat8
  • PostgreSQL9.4

データソース設定

参考
Apache Tomcat 8 (8.0.28) - JNDI Datasource HOW-TO

<?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を外す。

  • web.xml
    これは設定していない。persistence.xmlでlookupするから不要だと思われる。

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タグを使う。