2005年8月 1日

DAOの入れ子とRandomStringUtils。

悩むなぁ、くそー。
何故なんだ、何故予想通りに動かないんだぁぁぁ。

って訳で、金曜から悩み続けたJTA関連の
コネクションリーク起こしてるルーチンですが、
調べた結果、仮説ができました。
いや、あくまで仮説なんだけど(^_^;

なんたって、へなちょこプログラマですから。
言う事鵜呑みにしないでね。てへ。

おまけ。

Java並列プログラミングTips
濃度濃いなぁ、このページ。
マルチスレッドについて、改めて勉強するのに見てみたんだけども。

メンバ変数の宣言
今更基本ですが。メンバ変数なんかにつける属性で
よく使うのは、static, final ですが、その他知らないヤツについて。
transient:変数がオブジェクトの持続性のある状態ではない
volatile:変数が非同期に変更される

重複投稿/submitを防ぐトランザクショントークンという考え方
なるほどねぇ…しかしうまく機能しない。何故だ。
スレッドがうまく1つ1つをこなしてないような気がする。
synchronized をかけてるんだけど、何故なんだ。
いや、それはちゃんと理解してないからだ>自分つっこみ

Balkingパターン
GoF以外のデザインパターン。
結城さんのところです。

セキュア・プログラミング講座
Javaのみならず、PerlもASPも載ってるでよ。

synchronized とレースコンディション
へぇー、レースコンディションって呼ぶんだ。。。

日本初!編曲できるCD
いいですねぇ、いいですねぇ。
U2のCDで遊んでみたいなぁ。

やってる事は、簡単(?)に言うと
DAOの入れ子状態。
って、もし言い方が変でも許して。
専門用語、弱いんだよねぇ…(^^;

やってる事↓。


  1. AaaDAOインスタンスの生成

  2. トランザクションリソースの取得

  3. begin()

  4. AaaDAO中でSQL実行

  5. AaaDAO中でBbbDAOインスタンスの生成

  6. BbbDAO中でSQL実行

  7. BbbDAO中でCccDAOインスタンスの生成

  8. CccDAO中でSQL実行

  9. CccDAO参照変数.close()

  10. BbbDAO参照変数.close()

  11. 成功時:commit() / 失敗時:rollback()

  12. AaaDao参照変数.close()

…で、これで実行してプロセスを監視してると、
どんどん私の実行しているDB接続のプロセスが増えていく…。

勿論、出来る事なら、全てのDAOを最後にclose()したいんだけど
そうはいかない構造だったりして。
それが不安だったので、前以て先生に確認したんだけど、おかしいな。

おまけに、よく調べたら、他の似たルーチンは問題なくて、
1階層下、つまり、上記の例で言うならBbbDAOまであるヤツなら
正常にclose()出来てるんだよね。

つまり、仮説。
「トランザクションリソースを取得しているロジック内から、
 2階層下以上深くなると、
 close()がまともに実行されない」

・・・うーん、なんかイマイチ煮え切らないな(汗)
もっと調べたいところなんだけど、
一応急いでこなさないといけない課題なんだよなぁ、これ(^^;


ところで、この問題の他にも問題があって、
その解決のために、ランダムな文字列を自動生成したかったところ
ググってるうちに、RandomStringUtils を発見。

しかし、なにやらいつものJDKとかではないな…と思い
躊躇してたら、先生が設定方法を教えてくださいました(^^)/

  1. このクラスは JakartaのCommonsに入ってるらしいので 「commons-lang-2.1.zip」をダウンロード。
  2. 適当にどっかライブラリ置いてるような所に解凍。(私はいつもの解凍レンジで)
  3. Eclipseで、このクラスを使いたいプロジェクトを右クリックし、 「プロパティー」を選択。
  4. 現れたウインドウ内で、左側から「Java Build Path」を選択。
  5. 右側の空間から「ライブラリー」タグをクリックし、「外部JARの追加」ボタンを押す。
  6. 現れた画面上で、さっき解凍した「commons-lang-2.1.jar」を選択して「開く」ボタンを押す。
  7. 戻ってきた画面上で「OK」ボタンを押す。

で、こうして取り込んだプロジェクト内で
適当にクラス作ってテストしてみる。


package test;
import org.apache.commons.lang.RandomStringUtils;

public class RandamStringTest {

public static void main(String[] args) {
// 英数字でランダムな文字列
System.out.println(RandomStringUtils.randomAlphanumeric(10));

// アルファベットでランダムな文字列
System.out.println(RandomStringUtils.randomAlphabetic(10));

// ASCIIコードで32番~126番でランダムな文字列
System.out.println(RandomStringUtils.randomAscii(10));

// 数字でランダムな文字列
System.out.println(RandomStringUtils.randomNumeric(10));
}
}


出力結果:
82z3tZ5WbM
CrvVrmtUyS
ogwR$'n|rn
7845958264

…すんばらしい。
確かにサクッとランダムな文字列が出てきたぞ。
ちなみに引数に10を設定したから、全部10文字なだけで
勿論、文字数は調整可能。

よーし、このクラスは明日学校で課題で使おうっかなー♪

Posted by anigon at 11:44 PM

「気合で採血5。」へ戻る | 「トランザクショントークンもどき。」へ進む

上へ戻る