7.7.2 Exceptionトレースログ
トラブルシュート情報として,Exceptionトレースログを取得できます。Exceptionトレースログには,JDBCドライバ内で例外による障害が発生した際の障害要因が出力されます。
出力内容を次に示します。
-
例外発生時の情報(エラーメッセージなど)
-
例外が発生するまでの,JDBCのAPIメソッドの実行記録
この機能を使用すると,APから呼び出されるJDBCのAPIメソッドの情報がJDBCドライバのメモリ上に蓄積され,SQLException,BatchUpdateException,SQLClientInfoException,またはUnSupportedOperationExceptionの発生を契機として,例外を投入する前に,メモリ上に蓄積された情報がファイルに出力されます。
- 〈この項の構成〉
(1) 取得するメソッド,および取得するための設定
(a) Exceptionトレースログの取得対象メソッド
Exceptionトレースログの取得対象は,Java Platform Standard Edition 6のAPI仕様にあるパッケージjava.sql,javax.sqlに記述されているメソッドの呼び出しと戻りです。
次の条件を満たすメソッドが取得されます。
-
「表7‒16 Exceptionトレースログの取得対象であるメソッドとトレース取得レベル」に記載されていて,かつ取得に必要なトレース取得レベルを指定している
なお,ResultSetオブジェクトのgetXXXメソッド,PreparedStatementオブジェクトのsetXXXメソッド,ConnectionオブジェクトのisClosedメソッドなど,オブジェクト内の情報を参照して返すだけのメソッドや,オブジェクト内に情報を格納するだけのメソッドは取得対象になりません。
Exceptionトレースログの取得対象であるメソッドと,そのメソッドのトレース取得レベルを次の表に示します。
クラス |
メソッド |
トレース取得レベル |
||||
---|---|---|---|---|---|---|
1 |
2 |
3 |
4 |
5※1 |
||
Connection |
void close() |
○ |
○ |
○ |
○ |
○ |
void commit() |
× |
○ |
○ |
○ |
○ |
|
Statement createStatement()※2 |
○ |
○ |
○ |
○ |
○ |
|
Statement createStatement(int resultSetType, int resultSetConcurrency)※3 |
○ |
○ |
○ |
○ |
○ |
|
DatabaseMetaData getMetaData() |
× |
○ |
○ |
○ |
○ |
|
boolean isValid(int timeout) |
× |
○ |
○ |
○ |
○ |
|
PreparedStatement prepareStatement(String sql)※2 |
○ |
○ |
○ |
○ |
○ |
|
PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)※3 |
○ |
○ |
○ |
○ |
○ |
|
void rollback()※2 |
× |
○ |
○ |
○ |
○ |
|
void setAutoCommit(boolean autoCommit) |
× |
○ |
○ |
○ |
○ |
|
DatabaseMetaData |
boolean autoCommitFailureClosesAllResultSets() |
× |
○ |
○ |
○ |
○ |
ResultSet getAttributes(String catalog, String schemaPattern, String typeNamePattern, String attributeNamePattern) |
× |
○ |
○ |
○ |
○ |
|
ResultSet getBestRowIdentifier(String catalog, String schema, String table, int scope, boolean nullable) |
× |
○ |
○ |
○ |
○ |
|
ResultSet getCatalogs() |
× |
○ |
○ |
○ |
○ |
|
ResultSet getClientInfoProperties() |
× |
○ |
○ |
○ |
○ |
|
ResultSet getColumnPrivileges(String catalog, String schema, String table, String columnNamePattern) |
× |
○ |
○ |
○ |
○ |
|
ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) |
× |
○ |
○ |
○ |
○ |
|
Connection getConnection() |
× |
○ |
○ |
○ |
○ |
|
ResultSet getCrossReference(String parentCatalog, String parentSchema, String parentTable, String foreignCatalog, String foreignSchema, String foreignTable) |
× |
○ |
○ |
○ |
○ |
|
ResultSet getExportedKeys(String catalog, String schema, String table) |
× |
○ |
○ |
○ |
○ |
|
ResultSet getFunctions(String catalog, String schemaPattern, String functionNamePattern) |
× |
○ |
○ |
○ |
○ |
|
ResultSet getFunctionColumns(String catalog, String schemaPattern, String functionNamePattern, String columnNamePattern) |
× |
○ |
○ |
○ |
○ |
|
ResultSet getImportedKeys(String catalog, String schema, String table) |
× |
○ |
○ |
○ |
○ |
|
ResultSet getIndexInfo(String catalog, String schema, String table, boolean unique, boolean approximate) |
× |
○ |
○ |
○ |
○ |
|
ResultSet getPrimaryKeys(String catalog, String schema, String table) |
× |
○ |
○ |
○ |
○ |
|
ResultSet getProcedureColumns(String catalog, String schemaPattern, String procedureNamePattern, String columnNamePattern) |
× |
○ |
○ |
○ |
○ |
|
ResultSet getProcedures(String catalog, String schemaPattern, String procedureNamePattern) |
× |
○ |
○ |
○ |
○ |
|
ResultSet getPseudoColumns(String catalog,String schemaPattern,String tableNamePattern,String columnNamePattern) |
× |
○ |
○ |
○ |
○ |
|
RowIdLifetime getRowIdLifetime() |
× |
○ |
○ |
○ |
○ |
|
ResultSet getSchemas() |
× |
○ |
○ |
○ |
○ |
|
ResultSet getSuperTables(String catalog, String schemaPattern, String tableNamePattern) |
× |
○ |
○ |
○ |
○ |
|
ResultSet getSuperTypes(String catalog, String schemaPattern, String typeNamePattern) |
× |
○ |
○ |
○ |
○ |
|
ResultSet getTablePrivileges(String catalog, String schemaPattern, String tableNamePattern) |
× |
○ |
○ |
○ |
○ |
|
ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types) |
× |
○ |
○ |
○ |
○ |
|
ResultSet getTableTypes() |
× |
○ |
○ |
○ |
○ |
|
ResultSet getTypeInfo() |
× |
○ |
○ |
○ |
○ |
|
ResultSet getUDTs(String catalog, String schemaPattern, String typeNamePattern, int[] types) |
× |
○ |
○ |
○ |
○ |
|
ResultSet getVersionColumns(String catalog, String schema, String table) |
× |
○ |
○ |
○ |
○ |
|
Driver |
Connection connect(String url, Properties info) |
○ |
○ |
○ |
○ |
○ |
PreparedStatement |
boolean execute()※2 |
× |
○ |
○ |
○ |
○ |
ResultSet executeQuery()※2 |
× |
○ |
○ |
○ |
○ |
|
int executeUpdate()※2 |
× |
○ |
○ |
○ |
○ |
|
long executeLargeUpdate()※2 |
× |
○ |
○ |
○ |
○ |
|
ResultSetMetaData getMetaData() |
× |
○ |
○ |
○ |
○ |
|
boolean execute(String sql)※3,※4 |
× |
○ |
○ |
○ |
○ |
|
int[] executeBatch()※4 |
× |
○ |
○ |
○ |
○ |
|
long[] executeLargeBatch()※4 |
× |
○ |
○ |
○ |
○ |
|
ResultSet executeQuery(String sql)※3,※4 |
○ |
○ |
○ |
○ |
○ |
|
int executeUpdate(String sql)※3,※4 |
○ |
○ |
○ |
○ |
○ |
|
long executeLargeUpdate(String sql)※3,※4 |
○ |
○ |
○ |
○ |
○ |
|
ParameterMetaData getParameterMetaData() |
× |
○ |
○ |
○ |
○ |
|
ResultSet |
boolean absolute(int row) |
× |
○ |
○ |
○ |
○ |
void afterLast() |
× |
○ |
○ |
○ |
○ |
|
void beforeFirst() |
× |
○ |
○ |
○ |
○ |
|
void close() |
× |
○ |
○ |
○ |
○ |
|
boolean first() |
× |
○ |
○ |
○ |
○ |
|
ResultSetMetaData getMetaData() |
× |
○ |
○ |
○ |
○ |
|
int getHoldability() |
× |
○ |
○ |
○ |
○ |
|
Statement getStatement() |
× |
○ |
○ |
○ |
○ |
|
boolean isClosed() |
× |
○ |
○ |
○ |
○ |
|
boolean last() |
× |
○ |
○ |
○ |
○ |
|
boolean next() |
× |
○ |
○ |
○ |
○ |
|
boolean relative(int rows) |
× |
○ |
○ |
○ |
○ |
|
boolean isAfterLast() |
× |
○ |
○ |
○ |
○ |
|
boolean isBeforeFirst() |
× |
○ |
○ |
○ |
○ |
|
boolean isLast() |
× |
○ |
○ |
○ |
○ |
|
Statement |
void cancel() |
× |
○ |
○ |
○ |
○ |
void close() |
○ |
○ |
○ |
○ |
○ |
|
boolean execute(String sql) |
○ |
○ |
○ |
○ |
○ |
|
int[] executeBatch() |
× |
○ |
○ |
○ |
○ |
|
long[] executeLargeBatch() |
× |
○ |
○ |
○ |
○ |
|
ResultSet executeQuery(String sql) |
○ |
○ |
○ |
○ |
○ |
|
int executeUpdate(String sql) |
○ |
○ |
○ |
○ |
○ |
|
long executeLargeUpdate(String sql) |
○ |
○ |
○ |
○ |
○ |
|
ResultSet getResultSet() |
× |
○ |
○ |
○ |
○ |
|
DataSource |
getConnection()※2 |
○ |
○ |
○ |
○ |
○ |
getConnection(String username, String password)※3 |
○ |
○ |
○ |
○ |
○ |
|
ConnectionPoolDataSource |
getPooledConnection()※2 |
○ |
○ |
○ |
○ |
○ |
getPooledConnection(String username, String password)※3 |
○ |
○ |
○ |
○ |
○ |
|
PooledConnection |
close() |
○ |
○ |
○ |
○ |
○ |
getConnection() |
○ |
○ |
○ |
○ |
○ |
- (凡例)
-
○:Exceptionトレースログを取得します。
×:Exceptionトレースログを取得しません。
- 注※1
-
トレース取得レベルが5の場合,内部呼び出しも含めてExceptionトレースログを取得します。
- 注※2
-
メソッド名として,「メソッド名(1)」と出力されます。
- 注※3
-
メソッド名として,「メソッド名(2)」と出力されます。
- 注※4
-
Statementクラスのメソッドをオーバライドしたメソッドです。
(b) Exceptionトレースログを取得するための設定(プロパティの設定)
Exceptionトレースログのファイル出力先,ファイルへの出力数,メモリ内取得情報数,およびトレース取得レベルをシステムプロパティ,ユーザプロパティ,または接続用のURLのプロパティで設定します。
プロパティに設定する項目を次の表に示します。
項目 |
プロパティ |
内容 |
デフォルト値※ |
---|---|---|---|
ファイル出力先 |
adb_jdbc_exc_trc_out_path |
Exceptionトレースログを出力するディレクトリを,絶対パスで指定します。Exceptionトレースログは,指定したディレクトリの直下に出力されます。 |
カレントディレクトリ |
ファイルへの出力数 |
adb_jdbc_info_max |
1ファイルへ出力する情報数の上限を指定します。指定できる範囲は1〜50です。 実際に1ファイルへ出力する情報数の上限は,「ファイルへの出力数」×「メモリ内取得情報数」個となります。 ファイルへの出力数は,「(2) Exceptionトレースログの出力形式」に示す形式2〜形式4をそれぞれ1個と数えます。 なお,ファイルには,メモリに蓄積した順番に出力されます。 また,上限値を超えてファイルに出力する場合は,2ファイルでラップアラウンドします。ファイル名は次のとおりです。
ただし,「(2) Exceptionトレースログの出力形式」に示す形式1と形式2の間で出力先のファイルが切り替わることはありません。 |
5 |
メモリ内取得情報数 |
adb_jdbc_cache_info_max |
メモリ内で蓄積する情報数の上限を指定します。指定できる範囲は500〜10,000です。 なお,メモリ内取得情報は,「表7‒16 Exceptionトレースログの取得対象であるメソッドとトレース取得レベル」に示すメソッド1つを1個と数えます。 また,上限値を超えて情報を蓄積しようとすると,古い情報から順に,新しい情報に上書きされます。 |
1,000 |
トレース取得レベル |
adb_jdbc_trc_out_lv |
トレース取得レベルを指定します。指定できる範囲は0〜5です。 5を指定すると,内部呼び出しを含めたすべてのトレース取得対象メソッドを取得します。 0を指定すると,Exceptionトレースログを取得しません。 |
1 |
- 注※
-
次のような場合に取得するExceptionトレースログでは,プロパティに値が指定されなかったものと見なされます。その場合はデフォルト値が仮定されます。
-
プロパティに不正な値が指定され,データベース接続時にSQLExceptionが投入された場合
-
Java仮想マシンが,セキュリティマネジャによってJDBCドライバに対するプロパティの受け渡しを拒否した場合
-
Java仮想マシンの,最初の接続が確立する前
-
(2) Exceptionトレースログの出力形式
Exceptionトレースログには,次の4種類の形式があります。
- 形式1:ヘッダ部分
-
[AA....AA] Hitachi Advanced Data Binder JDBC Driver BB-CC
- 形式2:メソッドの実行履歴(メソッドの実行開始)
-
AAAAAAAAAAAAAAAAAAAAAAA BB....BB:[C][DD....DD] ConnectionID(EE....EE) : SID(FF....FF) GG....GG
- 形式3:メソッドの実行履歴(メソッドの正常終了)
-
AAAAAAAAAAAAAAAAAAAAAAA BB....BB:[C][DD....DD] ConnectionID(EE....EE) : SID(FF....FF) HH....HH
- 形式4:発生した出力契機
-
AAAAAAAAAAAAAAAAAAAAAAA BB....BB:Exception: II....II
形式2および形式3は,時系列順に,メソッドを実行した分だけ繰り返して出力されます。
(a) 形式1の変数の説明
- AA....AA:
-
出力情報の通番です。
通番は1回の出力(出力エラーによる失敗も含む)ごとに1増加します。2,147,483,647を超えると,0に戻ります。
- BB:
-
JDBCドライバのバージョンです。
- CC:
-
JDBCドライバのリビジョンです。
(b) 形式2〜形式4の変数の説明
- AAAAAAAAAAAAAAAAAAAAAAA:
-
Exceptionトレースログの取得日時を,次の形式で出力します。それぞれの変数には,すべて0〜9の値が入ります。
YYYY/MM/DD hh:mm:ss.sss
YYYY:年(西暦)
MM:月
DD:日
hh:時(24時間形式)
mm:分
ss.sss:秒(小数点以下3桁を含みます)
- BB....BB:
-
該当するスレッドのスレッド識別情報を,次の形式で出力します。
Thread[aa....aa]@bb....bb
- aa....aa:
-
スレッド名,優先順位,スレッドグループ名を含む,スレッド情報です。形式はJava仮想マシンによって決まります。
- bb....bb:
-
オブジェクトのハッシュコードです。形式はJava仮想マシンによって決まります。
- C:
-
メソッドの呼び出し識別情報です。
- E:
-
メソッドが開始したときの履歴であることを示します。
- R:
-
メソッドが正常終了したときの履歴であることを示します。
- DD....DD:
-
オブジェクト識別子およびメソッド名を,次の形式で出力します。
aa....aa.bb....bb
- aa....aa:
-
オブジェクト識別子です(最大32文字)。形式はJava仮想マシンによって決まります。
- bb....bb:
-
メソッド名です。
- EE....EE:
-
接続IDを出力します(最大4文字)。
- FF....FF:
-
セクションIDを出力します(最大4文字)。
- GG....GG:
-
メソッドの引数を次の形式で出力します。引数がないメソッドでは出力しません。
aa....aa=bb....bb aa....aa=bb....bb : aa....aa=bb....bb
- aa....aa:
-
引数の名称です。
- bb....bb:
-
引数の内容です(最大256文字)。参照型値の場合,形式はオブジェクトによって決まります。
なお,次のメソッドの引数passwordについては,bb....bbに"*"1個を出力します。
-
DataSourceクラスのgetConnection(String username, String password)
-
ConnectionPoolDataSourceクラスのgetPooledConnection(String username, String password)
また,Driverクラスのconnect(String url,Properties info)の,引数info中の次のプロパティについては,値を"*"1個に置き換えて出力します。
-
password
- HH....HH:
-
メソッドの戻り値を次の形式で出力します。戻り値がないメソッドでは出力しません。戻り値が参照型値の場合,形式はJava仮想マシンによって決まります。
Return=aa....aa
- aa....aa:
-
メソッドの戻り値です。
- II....II:
-
トラブルシュート情報を,次の形式で出力します。
ExceptionClass: aa....aa ConnectionInformation: bb....bb Message: cc....cc ErrorCode: dd....dd SQLState: eeeee UpdateCounts: ff....ff, ..<省略>.. ,ff....ff gg....gg
- aa....aa:
-
投入した例外オブジェクトの実行クラス名です。
- bb....bb:
-
例外オブジェクトの接続情報を次の形式で出力します。出力しない場合は,"*"1個に置き換えて出力します。
yy....yy (zz....zz), ..<省略>.., yy....yy (zz....zz)
yy....yy:各接続情報の名称です。次に示す情報が出力されます。
-
host(HADBサーバのホスト名)
-
port(HADBサーバのポート番号)
-
user(認可識別子)
-
sqlwaittime(HADBクライアントの応答最大待ち時間(単位:秒))
zz....zz:上記の接続情報の内容です。なお,userのパスワード部分は出力しません。
-
- cc....cc:
-
例外オブジェクトが持つメッセージです。
複数のメッセージを持つ場合は,SQLCODEに対応するメッセージのあとに,改行で区切って出力します。この場合,例外オブジェクトのgetMessageメソッドで返却するメッセージなども,同様に改行で区切られた文字列になります。
- dd....dd:
-
SQLCODEのエラーコードです(最大11文字)。
投入した例外オブジェクトの実行クラスが次のクラスまたはサブクラスの場合に出力します。
-
SQLException
-
- eeeee:
-
例外オブジェクトのSQLSTATEです。
- ff....ff:
-
この例外が発生するまでに正常に実行されたバッチ更新の,各更新文の更新行数を出力します(最大11文字)。
例外オブジェクトの実行クラスがBatchUpdateExceptionの場合に出力します。
更新行数が取得できない場合,"*"を出力します。
- gg....gg:
-
例外投入メソッドを基点としたスタックトレースを出力します。形式はJava仮想マシンによって決まります。
(3) 出力例と解析方法
(a) 出力例
[1] Hitachi Advanced Data Binder JDBC Driver VV-RR※ 2011/07/06 23:07:09.129 Thread[main,5,main]@1259414:[E][AdbConnection@82c01f.createStatement(1)] ConnectionID(1) : SID(0) 2011/07/06 23:07:09.160 Thread[main,5,main]@1259414:[R][AdbConnection@82c01f.createStatement(1)] ConnectionID(1) : SID(0) Return=com.hitachi.hadb.jdbc.AdbStatement@1e4cbc4 2011/07/06 23:07:09.160 Thread[main,5,main]@1259414:[E][AdbStatement@1e4cbc4.execute] ConnectionID(1) : SID(0) sql=DELETE FROM SEINO_TABLE 2011/07/06 23:07:14.285 Thread[main,5,main]@1259414:[E][AdbConnection@82c01f.commit] ConnectionID(1) : SID(0) 2011/07/06 23:07:14.301 Thread[main,5,main]@1259414:[R][AdbConnection@82c01f.commit] ConnectionID(1) : SID(0) 2011/07/06 23:07:14.301 Thread[main,5,main]@1259414:[R][AdbStatement@1e4cbc4.execute] ConnectionID(1) : SID(1) Return=false 2011/07/06 23:07:14.301 Thread[main,5,main]@1259414:[E][AdbConnection@82c01f.prepareStatement(1)] ConnectionID(1) : SID(0) sql=INSERT INTO SEINO_TABLE VALUES(?, ?) 2011/07/06 23:07:14.348 Thread[main,5,main]@1259414:[R][AdbConnection@82c01f.prepareStatement(1)] ConnectionID(1) : SID(0) Return=com.hitachi.hadb.jdbc.AdbPreparedStatement@15d56d5 2011/07/06 23:07:26.567 Thread[main,5,main]@1259414:[E][AdbConnection@82c01f.commit] ConnectionID(1) : SID(0) 2011/07/06 23:07:26.567 Thread[main,5,main]@1259414:[R][AdbConnection@82c01f.commit] ConnectionID(1) : SID(0) 2011/07/06 23:07:26.567 Thread[main,5,main]@1259414:[E][AdbStatement@1e4cbc4.executeQuery] ConnectionID(1) : SID(0) sql=SELECT * FROM SEINO_TABLE 2011/07/06 23:07:26.676 Thread[main,5,main]@1259414:[R][AdbStatement@1e4cbc4.executeQuery] ConnectionID(1) : SID(1) Return=com.hitachi.hadb.jdbc.AdbResultSet@3eca90 2011/07/06 23:07:28.332 Thread[main,5,main]@1259414:[E][AdbResultSet@3eca90.close] ConnectionID(1) : SID(1) 2011/07/06 23:07:28.332 Thread[main,5,main]@1259414:[E][AdbConnection@82c01f.commit] ConnectionID(1) : SID(0) 2011/07/06 23:07:28.332 Thread[main,5,main]@1259414:[R][AdbConnection@82c01f.commit] ConnectionID(1) : SID(0) 2011/07/06 23:07:28.332 Thread[main,5,main]@1259414:[R][AdbResultSet@3eca90.close] ConnectionID(1) : SID(0) 2011/07/06 23:07:28.332 Thread[Thread-0,5,main]@30090737:[E][AdbConnection@82c01f.prepareStatement(1)] ConnectionID(1) : SID(0) sql=SELECT * FROM SEINO_TABLE 2011/07/06 23:07:28.332 Thread[Thread-0,5,main]@30090737:[R][AdbConnection@82c01f.prepareStatement(1)] ConnectionID(1) : SID(0) Return=com.hitachi.hadb.jdbc.AdbPreparedStatement@2808b3 2011/07/06 23:07:28.348 Thread[Thread-1,5,main]@5462872:[E][AdbConnection@82c01f.prepareStatement(1)] ConnectionID(1) : SID(0) sql=DELETE FROM SEINO_TABLE WHERE I1=? 2011/07/06 23:07:28.358 Thread[Thread-1,5,main]@5462872:[E][AdbConnection@82c01f.commit] ConnectionID(1) : SID(0) 2011/07/06 23:07:29.672 Thread[Thread-1,5,main]@5462872:[R][AdbConnection@82c01f.commit] ConnectionID(1) : SID(0) 2011/07/06 23:07:30.098 Thread[Thread-1,5,main]@5462872:[R][AdbConnection@82c01f.prepareStatement(1)] ConnectionID(1) : SID(0) Return=com.hitachi.hadb.jdbc.AdbPreparedStatement@922804 2011/07/06 23:07:30.332 Thread[Thread-2,5,main]@25253977:[E][AdbConnection@82c01f.rollback(1)] ConnectionID(1) : SID(0) 2011/07/06 23:07:42.098 Thread[Thread-2,5,main]@25253977:[R][AdbConnection@82c01f.rollback(1)] ConnectionID(1) : SID(0) 2011/07/06 23:07:42.098 Thread[Thread-2,5,main]@25253977:[E][AdbConnection@82c01f.close] ConnectionID(1) : SID(0) 2011/07/06 23:07:42.098 Thread[Thread-2,5,main]@25253977:[R][AdbConnection@82c01f.close] ConnectionID(1) : SID(0) 2011/07/06 23:07:42.535 Thread[Thread-1,5,main]@5462872:Exception: ExceptionClass: SQLNonTransientException ConnectionInformation: * Message: KFAA71206-E Processing cannot continue because the connection is already closed. [AdbPreparedStatement.setInt] ErrorCode: -1071206 SQLState: R2416 java.sql.SQLNonTransientException: KFAA71206-E Processing cannot continue because the connection is already closed. [AdbPreparedStatement.setInt] at com.hitachi.hadb.jdbc.JdbMakeException.generateSQLSubException(JdbMakeException.java:271) at com.hitachi.hadb.jdbc.JdbMakeException.generateSQLException(JdbMakeException.java:37) at com.hitachi.hadb.jdbc.AdbStatement.generateClosedSQLException(AdbStatement.java:3005) at com.hitachi.hadb.jdbc.AdbPreparedStatement.setInt(AdbPreparedStatement.java:1170) at Exception1.run(ExceptionTraceSample.java:57) [2] Hitachi Advanced Data Binder JDBC Driver VV-RR※ 2011/07/06 23:07:25.723 Thread[Thread-3,5,main]@13249998:[E][AdbConnection@119cca4.prepareStatement(1)] ConnectionID(1) : SID(0) sql=SELECT * FROM SEINO_TABLE 2011/07/06 23:07:25.770 Thread[Thread-4,5,main]@25839584:[E][AdbConnection@119cca4.rollback(1)] ConnectionID(1) : SID(0) 2011/07/06 23:07:25.770 Thread[Thread-4,5,main]@25839584:[R][AdbConnection@119cca4.rollback(1)] ConnectionID(1) : SID(0) 2011/07/06 23:07:25.770 Thread[Thread-5,5,main]@24431647:[E][AdbConnection@119cca4.prepareStatement(1)] ConnectionID(1) : SID(0) sql=SELECT ** FROM SEINO_TABLE 2011/07/06 23:07:25.863 Thread[Thread-5,5,main]@24431647:Exception: ExceptionClass: SQLSyntaxErrorException ConnectionInformation: user(ADBUSER01), sqlwaittime(0), host(dragon2), port(20249) Message: KFAA30105-E Token "*"(non-reserved word), which is after token "*", is invalid.[AdbStatement.prepare] ErrorCode: -105 SQLState: 42602 java.sql.SQLSyntaxErrorException: KFAA30105-E Token "*"(non-reserved word), which is after token "*", is invalid.[AdbStatement.prepare] at com.hitachi.hadb.cli.CtlStatement.prepare(CtlStatement.java:451) at com.hitachi.hadb.jdbc.JdbSection.prepare(JdbSection.java:1497) at com.hitachi.hadb.jdbc.AdbStatement.prepare(AdbStatement.java:2834) at com.hitachi.hadb.jdbc.AdbPreparedStatement.<init>(AdbPreparedStatement.java:109) at com.hitachi.hadb.jdbc.AdbConnection.prepareStatement(AdbConnection.java:1041) at Exception1.run(ExceptionTraceSample.java:64)
- 注※
-
VV-RRには,JDBCドライバのバージョンが出力されます。
(b) 解析方法
Exceptionトレースログの解析方法について説明します。Exceptionトレースログはテキストエディタなどで参照できます。
ここでは,「(a) 出力例」のExceptionトレースログを解析する例を示します。
解析例
-
調査対象の例外を含む通番の情報を抜き出します。
-
情報をThread識別情報で分類し,スレッドごとに分割します。
-
取得時刻によって,情報を時系列に並べます。
次の表に示すようになります。
表7‒18 Exceptionトレースログを時系列に並べた例 日時
スレッド1
スレッド2
スレッド3
スレッド4
Thread[main,5,main]@1259414
Thread[Thread-0,5,main]@30090737
Thread[Thread-1,5,main]@5462872
Thread[Thread-2,5,main]@25253977
2011/07/06
23:07:09.129
AdbConnection@82c01f.createStatement(1)
2011/07/06
23:07:09.160
AdbStatement@1e4cbc4.execute
2011/07/06
23:07:14.285
AdbConnection@82c01f.commit
2011/07/06
23:07:14.301
AdbConnection@82c01f.prepareStatement(1)
2011/07/06
23:07:26.567
AdbConnection@82c01f.commit
2011/07/06
23:07:26.567
AdbConnection@82c01f.commit
2011/07/06
23:07:26.567
AdbStatement@1e4cbc4.executeQuery
2011/07/06
23:07:28.332
AdbResultSet@3eca90.close
AdbConnection@82c01f.prepareStatement(1)
2011/07/06
23:07:28.332
AdbConnection@82c01f.commit
2011/07/06
23:07:28.348
AdbConnection@82c01f.prepareStatement(1)
2011/07/06
23:07:28.358
AdbConnection@82c01f.commit
2011/07/06
23:07:30.332
AdbConnection@82c01f.rollback(1)
2011/07/06
23:07:42.098
AdbConnection@82c01f.close
2011/07/06
23:07:42.535
SQLException発生
"KFAA71206-E Processing cannot continue because the connection is already closed."
-
Exceptionのエラーの内容を確認します。
2011/07/06 23:07:42.535のスレッド3でSQLExceptionが発生し,StatementオブジェクトまたはConnectionオブジェクトがすでにクローズされていることがわかります。
-
時系列でオブジェクトの操作を確認します。
次のスレッドのConnectionオブジェクトのオブジェクトIDが同じであることから,4つのスレッドが同一のコネクションで処理されていることがわかります。
-
2011/07/06 23:07:09.129のスレッド1
-
2011/07/06 23:07:28.332のスレッド2
-
2011/07/06 23:07:28.348のスレッド3
-
2011/07/06 23:07:30.332のスレッド4
-
-
エラーの原因である個所を探します。
4つのスレッドが同一のコネクションであることはわかったので,Statement.closeメソッドまたはConnection.closeメソッドを実行している個所を探すと,スレッド4が2011/07/06 23:07:42.098でConnection.closeメソッドを実行していることがわかります。このことから,2011/07/06 23:07:42.535のスレッド3で発生したSQLExceptionの原因は,スレッド4が2011/07/06 23:07:42.098でConnection.closeメソッドを実行したためであるとわかります。
(4) 必要となるメモリ所要量およびファイルサイズ
(a) メモリ所要量
Exceptionトレースログを取得するためのメモリ所要量は,次に示す計算式で求められます。
- 計算式
-
↑360×n÷1024↑ (単位:キロバイト)
- 変数の説明
-
n:メモリ内取得情報数(システムプロパティ,ユーザプロパティ,または接続用のURLのプロパティのadb_jdbc_cache_info_maxの指定値)
(b) 必要となるファイルサイズ
Exceptionトレースログを取得するためのファイルサイズの概算は,次に示す計算式で求められます。
- 計算式
-
↑180×n×m÷1024↑+2 (単位:キロバイト)
- 変数の説明
-
n:メモリ内取得情報数(システムプロパティ,ユーザプロパティ,または接続用のURLのプロパティのadb_jdbc_cache_info_maxの指定値)
m:ファイル出力情報数(システムプロパティ,ユーザプロパティ,または接続用のURLのプロパティのadb_jdbc_info_maxの指定値)
(5) 注意事項
(a) Java仮想マシン起動後の最初の出力
Java仮想マシン起動後,最初にファイルにExceptionトレースログを出力する場合は,更新日時が古い方のファイルに出力されます。同じ場合は,adbjdbcexception01.trcに出力されます。
(b) ファイル出力先の指定
複数のプロセスからExceptionトレースログを取得する場合,同じファイル出力先を指定していると,同一ファイルに異なるプロセスのトレースが出力されます。プロセスごとにトレースを取得する場合は,プロセスごとに異なるファイル出力先を指定してください。
JDBCドライバは,Java仮想マシンの機能を通じてOSが提供するファイルシステム上にログファイルを作成します。そのため,次の点については,使用するJava仮想マシンおよびファイルシステムに依存します。
-
絶対パス名の接頭辞
-
パスの区切り文字
-
出力先ファイル(絶対パス)の最大文字数
-
1ファイル当たりのサイズ
(c) エラー発生時の処理
ファイルの作成や出力に失敗しても,Exceptionトレースログには情報が出力されません。また,エラーメッセージがAPに返されたり,ファイル出力をリトライしたりすることもありません。
(d) 文字コード
Exceptionトレースログは,使用するJava仮想マシンのデフォルトの変換文字セットで出力されます。