[Seasar-user:21641] Re: S2DaoがDBメタデータ取得時に発行していると思われるSQL文について

Toshihiro Nakamura [E-MAIL ADDRESS DELETED]
2013年 7月 4日 (木) 21:47:54 JST


中村(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文の発行タイミング、トリガー、その他規則性などはあるか
>
> よろしくお願いします。
> -------------------------------------------------------
> 株式会社 アイ・ティ・フロンティア
> 西村 勇人
> E-mail nishimura_hayato @ itfrontier.co.jp
> ----------------------------------------------------
>
>
> _______________________________________________
> Seasar-user mailing list
> Seasar-user @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/seasar-user
>
>


-- 
Toshihiro Nakamura
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://ml.seasar.org/archives/seasar-user/attachments/20130704/5695e4e8/attachment.html>


Seasar-user メーリングリストの案内