JPAの機能を使用しているアプリケーションの調査やチューニングでInterstage永続性プロバイダが発行しているSQL文を確認するため、SQLログ機能を使用できます。SQLログを使用すると、Interstage永続性プロバイダはSQL文を発行する時に、またはSQL文の発行時に例外が発生するときに、SQL文と動的パラメタをログに出力します。
SQLログは、以下の永続性ユニットプロパティにより設定します。
永続性ユニットプロパティ名 | 値(太字:省略値) | 説明 |
---|---|---|
eclipselink.logging.level.sql | FINE | SQL文をサーバーログに出力します。 |
CONFIG | 例外が発生する場合だけSQL文をサーバーログに出力します。 | |
INFO | SQL文をサーバーログに出力しません。 |
値は、大文字と小文字を区別しません。
永続性ユニットプロパティをdeployment descriptor (persistence.xml)、またはエンティティマネージャファクトリの取得時にjavax.persistence.PersistenceのcreateEntityManagerFactory(String, Map)メソッドに指定します。
永続性ユニットプロパティをdeployment descriptor (persistence.xml)とcreateEntityManagerFactoryメソッドの両方に指定した場合、createEntityManagerFactoryメソッドに指定した設定を優先します。
例
SQLログの設定例を以下に示します。
<persistence 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_2_0.xsd
version="2.0">
<persistence-unit name="com.company.my.pu">
<jta-data-source>jdbc/myDatasource</jta-data-source>
<properties>
<property name="eclipselink.logging.level.sql" value="FINE"/>
</properties>
</persistence-unit>
</persistence>
例
FINEを指定した場合のサーバーログへのSQLログ出力例を以下に示します。
[#|2016-05-20T20:54:45.879+0900|FINE|||_ThreadID=718;_ThreadName=p: thread-pool-1; w: 5;|JPA0021: SQL statement=INSERT INTO DEPT (DEPTNO, dname, LOC) VALUES (1, dname, loc)|#] [#|2016-05-20T20:54:45.887+0900|WARNING|||_ThreadID=718;_ThreadName=p: thread-pool-1; w: 5;|JPA0020: caught throwable Local Exception Stack: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.qualifier): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: java.sql.SQLIntegrityConstraintViolationException: この文は、一意キー制約または主キー制約、または'DEPT'上で定義された'SQL160520205431510'によって識別される一意索引において重複キー値の原因となる可能性があったため、中断されました。 Error Code: 20000 Call: INSERT INTO DEPT (DEPTNO, dname, LOC) VALUES (1, 'dname', 'loc') Query: InsertObjectQuery(com.entity.Dept@34ab3146) |
本機能をJava SEスタンドアローンアプリケーションで使用する場合、本プロパティを、Java VMオプションとして設定できます。Java VMオプションとcreateEntityManagerFactoryメソッドの両方に指定した場合、createEntityManagerFactoryメソッドに指定した設定を優先します。また、Java VMオプションとdeployment descriptor (persistence.xml)の両方に指定した場合、deployment descriptor (persistence.xml)に指定した設定を優先します。
例
Java SE環境のSQLログ出力例を以下に示します。
[EL Fine]: 2013-02-25 13:23:34.671--ClientSession(17912146)--Connection(238 30114) --JPA0021: SQL statement=select * from newdept where deptno =? bind => [1 parameter bound]