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

Toshihiro Nakamura [E-MAIL ADDRESS DELETED]
2013年 7月 4日 (木) 23:32:34 JST


中村(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文の発行タイミング、トリガー、その他規則性などはあるか
>>
>> よろしくお願いします。
>> -------------------------------------------------------
>> 株式会社 アイ・ティ・フロンティア
>> 西村 勇人
>> 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
>



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


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