[Seasar-user:21646] Re: S2DaoがDBメタデータ取得時に発行していると思われるSQL文について
[E-MAIL ADDRESS DELETED]
[E-MAIL ADDRESS DELETED]
2013年 7月 5日 (金) 10:55:41 JST
中村様
お世話になっております。
アイ・ティ・フロンティアの西村です。
ご回答ありがとうございました。
SQL文発行タイミングについて、了解しました。
また、当方のアプリケーションでは、以下のDaoによって、
実行するメソッドが分かれると認識いたしました。
・JavaBeansに格納された値からSQL文を自動生成するDao
下記d) に対応します。
DBテーブルのカラム名に対応しているプロパティを持っています。
→getColumns、getPrimaryKeysの両方を実行する。
・外部SQLファイルによってSQL文を発行するDao
下記a)っまたはb) に対応します。
要件により、外部ファイル内に動的SQL文が入ります。
→getColumnsのみ実行する。
dao.diconの変更についても、情報ありがとうございます。
参考にさせていただきます。
よろしくお願いします。
-------------------------------------------------------
株式会社 アイ・ティ・フロンティア
西村 勇人
----------------------------------------------------
送信元: Toshihiro Nakamura <toshihiro.nakamura @ gmail.com>
宛先: seasar-user @ ml.seasar.org
日付: 2013/07/04 23:32
件名: [Seasar-user:21642] Re: S2DaoがDBメタデータ取得時に発行していると
思われるSQL文について
送信者: seasar-user-bounces @ ml.seasar.org
中村(taedium)です。
先ほどのメールで、
java.sql.DatabaseMetaData経由のDBアクセスが発生する条件について
まちがったことを言ってしまいました。
訂正させてください。
getColumnsは、a)、b)、c)、d)すべてのケースで呼び出されます。
getPrimaryKeysは、d)のケースだけで呼び出されます。
2013年7月4日 21:47 Toshihiro Nakamura <toshihiro.nakamura @ gmail.com>:
中村(taedium)です。
> ・当該のSQL文は、DB接続時のメタデータ取得のために、S2DaoとDBのドライバに
よって
> 発行されているという認識で問題ないか
はい。
それぞれ、java.sql.DatabaseMetaDataクラスの以下のメソッドの呼び出しに対応
しています。
- getPrimaryKeys
- getColumns
> ・当該のSQL文の発行回数を見積もる計算式などはあるか
> ・当該のSQL文の発行タイミング、トリガー、その他規則性などはあるか
規則性はあります。
ソースコードを追いかけてみました。
ただし、大まかな情報だと思ってください。
getColumnsは以下の対象ごとに呼ばれます。
a) Daoメソッドのパラメータに登場するテーブルに対応しないJavaBeans(SQLを自
動生成する場合)
b) Daoメソッドの戻り値に登場するテーブルに対応しないJavaBeans
c) EntityManagerの各種メソッドの第1引数に登場するJavaBeans
getPrimaryKeysは上記に加え以下の対象ごとに呼ばれます
d) Daoクラスに対応するJavaBeans(リレーションシップがある場合はその
JavaBeansも)
a)とd)はDaoの初期化時に一度だけ呼ばれます。
b)やc)のJavaBeansについてはDBアクセスの結果がキャッシュされるため、
同じJavaBeansがすでに処理されている場合にはDBアクセスは行われません。
もっと詳細な条件を把握するには、ログを仕込むのがいいかと思います。
S2DaoのPropertyTypeFactoryImplクラスの次のメソッドが上述した
DatabaseMetaDataクラスの
2つのメソッドに対応します。
- setupPrimaryKey
- getColumns
PropertyTypeFactoryImplのビルダをdao.diconで変更できます。
なお、設定をカスタマイズしてアノテーションを付与すれば
DatabaseMetaDataを使ったDBアクセスをなくすことができます。
http://s2dao.seasar.org/ja/daoDicon.html#customizationByComponent
2013年7月4日 16:45 <nishimura_hayato @ itfrontier.co.jp>:
seasar-userのみなさま
初めて投稿させていただきます。
株式会社アイ・ティ・フロンティアの西村と申します。
現在、以下のS2製品、APサーバ、DBを利用して、
JavaとLinuxシェルでバッチアプリケーションの開発を行っています。
<APサーバ>
Weblogic Server 10.3.6.0
<DB>
Oracle Database 11g Express Edition
<S2関連製品>
s2-dao-1.0.49
s2-extension-2.4.40
s2-framework-2.4.40
s2-tiger-2.4.39
アプリケーションのテスト中に、DBに対して発行されるSQL文を監視していたとこ
ろ、
S2Container初期化〜Dao実行の間に、
DBに対して以下2種類のSQL文が発行されていることを確認しました。
↓
++++++++++++++++++++++++++++++
・テーブルの制約情報を取得していると思われるSQL文
SELECT NULL AS table_cat,
c.owner AS table_schem,
c.table_name,
c.column_name,
c.position AS key_seq,
c.constraint_name AS pk_name
FROM all_cons_columns c, all_constraints k
WHERE k.constraint_type = 'P'
AND k.table_name = :1
AND k.owner like :2 escape '/'
AND k.constraint_name = c.constraint_name
AND k.table_name = c.table_name
AND k.owner = c.owner
ORDER BY column_name
・テーブルのカラム情報を取得していると思われるSQL文
SELECT NULL AS table_cat,
t.owner AS table_schem,
t.table_name AS table_name,
t.column_name AS column_name,
DECODE (t.data_type, 'CHAR', 1, 'VARCHAR2', 12, 'NUMBER', 3,
'LONG', -1, 'DATE', 91, 'RAW', -3, 'LONG RAW', -4,
'BLOB', 2004, 'CLOB', 2005, 'BFILE', -13, 'FLOAT', 6,
'TIMESTAMP(6)', 93, 'TIMESTAMP(6) WITH TIME ZONE',
-101,
'TIMESTAMP(6) WITH LOCAL TIME ZONE', -102,
'INTERVAL YEAR(2) TO MONTH', -103,
'INTERVAL DAY(2) TO SECOND(6)', -104,
'BINARY_FLOAT', 100, 'BINARY_DOUBLE', 101,
1111)
AS data_type,
t.data_type AS type_name,
DECODE (t.data_precision, null, t.data_length,
t.data_precision)
AS column_size,
0 AS buffer_length,
t.data_scale AS decimal_digits,
10 AS num_prec_radix,
DECODE (t.nullable, 'N', 0, 1) AS nullable,
NULL AS remarks,
t.data_default AS column_def,
0 AS sql_data_type,
0 AS sql_datetime_sub,
t.data_length AS char_octet_length,
t.column_id AS ordinal_position,
DECODE (t.nullable, 'N', 'NO', 'YES') AS is_nullable
FROM all_tab_columns t
WHERE t.owner LIKE :1 ESCAPE '/'
AND t.table_name LIKE :2 ESCAPE '/'
AND t.column_name LIKE :3 ESCAPE '/'
ORDER BY table_schem, table_name, ordinal_position
+++++++++++++++++++++++++++++++
下記URLの方法をもとに、JDBC接続時のデバッグログを出力し、
デバッグログとタイミング、アプリケーションが出力しているログのDao実行のタ
イミングを比較しました。
http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/java.111/E05720-02/diagnose.htm
大きく分けて以下2種類のDaoがありますが、以下の種別に関係なく、
SQL文が発行されているDao、発行されていないDaoがあります。
・JavaBeansに格納された値からSQL文を自動生成するDao
・外部SQLファイルによってSQL文を発行するDao
本メールにて、以下の点についてご存知の方がいらっしゃいましたら、
どうかご教示いただきたく思います。
・当該のSQL文は、DB接続時のメタデータ取得のために、S2DaoとDBのドライバによ
って
発行されているという認識で問題ないか
・当該のSQL文の発行回数を見積もる計算式などはあるか
・当該のSQL文の発行タイミング、トリガー、その他規則性などはあるか
よろしくお願いします。
-------------------------------------------------------
株式会社 アイ・ティ・フロンティア
西村 勇人
----------------------------------------------------
_______________________________________________
Seasar-user mailing list
Seasar-user @ ml.seasar.org
https://ml.seasar.org/mailman/listinfo/seasar-user
--
Toshihiro Nakamura
--
Toshihiro Nakamura _______________________________________________
Seasar-user mailing list
Seasar-user @ ml.seasar.org
https://ml.seasar.org/mailman/listinfo/seasar-user
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://ml.seasar.org/archives/seasar-user/attachments/20130705/28aecac5/attachment.html>
Seasar-user メーリングリストの案内