[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 メーリングリストの案内