読者です 読者をやめる 読者になる 読者になる

hakobera's blog

技術メモ。たまに雑談

OpenJPA でc3p0をコネクション・プーリングとして利用する方法

Java EEサーバーのコネクションプールが使えない、という場合に使えるかも。

Apache commons-dbcp 用の設定はあったけどcommons-dbcp はログが何もでないので嫌だったので、c3p0を試してみたが、調べても設定がみつからなかったので試行錯誤してみた。結果、以下の設定でできた。

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
	xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
	<persistence-unit name="jpaPU" transaction-type="RESOURCE_LOCAL">
		<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
		<class>entity.Entity</class>
		<exclude-unlisted-classes>true</exclude-unlisted-classes>
		<properties>
			<!-- postgres の場合 : 以下は、プールしない場合の設定
			<property name="openjpa.ConnectionDriverName" value="org.postgresql.Driver" />
			<property name="openjpa.ConnectionURL" value="jdbc:postgresql://servername:5432/db" />
			<property name="openjpa.ConnectionUserName" value="user" />
			<property name="openjpa.ConnectionPassword" value="pass" />
			-->
			<property name="openjpa.jdbc.DBDictionary" value="postgres"/>
			<property name="openjpa.ConnectionDriverName" value="com.mchange.v2.c3p0.ComboPooledDataSource" />
			<property name="openjpa.ConnectionProperties"
				value="driverClass=org.postgresql.Driver, 
					   jdbcUrl=jdbc:postgresql://servername:5432/db,
					   user=user,
					   password=pass,
					   acquireIncrement=5,
					   initialPoolSize=5,
					   minPoolSize=5,
					   maxPoolSize=5,
					   maxStatements=500,
					   maxStatementsPerConnection=100,
					   checkoutTimeout=3000
				"/>
			
			<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=false)" />
			<property name="openjpa.Log" value="DefaultLevel=INFO,SQL=TRACE" />
			<property name="openjpa.ConnectionFactoryProperties" value="PrettyPrint=true, PrettyPrintLineLength=72"/>
			<property name="openjpa.LockManager" value="pessimistic" />
			<property name="openjpa.MaxFetchDepth" value="3" />
			<property name="openjpa.LockTimeout" value="30000" />
		</properties>
	</persistence-unit>
</persistence>

でも、レアケースだよなぁ・・・これ。
あと、OpenJPAは日本語の情報少なすぎ。人気無いのかなぁ・・・