DAOの入れ子とRandomStringUtils。
悩むなぁ、くそー。
何故なんだ、何故予想通りに動かないんだぁぁぁ。
って訳で、金曜から悩み続けたJTA関連の
コネクションリーク起こしてるルーチンですが、
調べた結果、仮説ができました。
いや、あくまで仮説なんだけど(^_^;
なんたって、へなちょこプログラマですから。
言う事鵜呑みにしないでね。てへ。
濃度濃いなぁ、このページ。
マルチスレッドについて、改めて勉強するのに見てみたんだけども。
今更基本ですが。メンバ変数なんかにつける属性で
よく使うのは、static, final ですが、その他知らないヤツについて。
transient:変数がオブジェクトの持続性のある状態ではない
volatile:変数が非同期に変更される
重複投稿/submitを防ぐトランザクショントークンという考え方
なるほどねぇ…しかしうまく機能しない。何故だ。
スレッドがうまく1つ1つをこなしてないような気がする。
synchronized をかけてるんだけど、何故なんだ。
いや、それはちゃんと理解してないからだ>自分つっこみ
結城さんのところです。
へぇー、レースコンディションって呼ぶんだ。。。
いいですねぇ、いいですねぇ。
U2のCDで遊んでみたいなぁ。
やってる事は、簡単(?)に言うと
DAOの入れ子状態。
って、もし言い方が変でも許して。
専門用語、弱いんだよねぇ…(^^;
やってる事↓。
- AaaDAOインスタンスの生成
- トランザクションリソースの取得
- begin()
- AaaDAO中でSQL実行
- AaaDAO中でBbbDAOインスタンスの生成
- BbbDAO中でSQL実行
- BbbDAO中でCccDAOインスタンスの生成
- CccDAO中でSQL実行
- CccDAO参照変数.close()
- BbbDAO参照変数.close()
- 成功時:commit() / 失敗時:rollback()
- AaaDao参照変数.close()
…で、これで実行してプロセスを監視してると、
どんどん私の実行しているDB接続のプロセスが増えていく…。
勿論、出来る事なら、全てのDAOを最後にclose()したいんだけど
そうはいかない構造だったりして。
それが不安だったので、前以て先生に確認したんだけど、おかしいな。
おまけに、よく調べたら、他の似たルーチンは問題なくて、
1階層下、つまり、上記の例で言うならBbbDAOまであるヤツなら
正常にclose()出来てるんだよね。
つまり、仮説。
「トランザクションリソースを取得しているロジック内から、
2階層下以上深くなると、
close()がまともに実行されない」
・・・うーん、なんかイマイチ煮え切らないな(汗)
もっと調べたいところなんだけど、
一応急いでこなさないといけない課題なんだよなぁ、これ(^^;
ところで、この問題の他にも問題があって、
その解決のために、ランダムな文字列を自動生成したかったところ
ググってるうちに、RandomStringUtils を発見。
しかし、なにやらいつものJDKとかではないな…と思い
躊躇してたら、先生が設定方法を教えてくださいました(^^)/
- このクラスは JakartaのCommonsに入ってるらしいので
「commons-lang-2.1.zip」をダウンロード。
- 適当にどっかライブラリ置いてるような所に解凍。(私はいつもの解凍レンジで)
- Eclipseで、このクラスを使いたいプロジェクトを右クリックし、
「プロパティー」を選択。
- 現れたウインドウ内で、左側から「Java Build Path」を選択。
- 右側の空間から「ライブラリー」タグをクリックし、「外部JARの追加」ボタンを押す。
- 現れた画面上で、さっき解凍した「commons-lang-2.1.jar」を選択して「開く」ボタンを押す。
- 戻ってきた画面上で「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文字なだけで
勿論、文字数は調整可能。
よーし、このクラスは明日学校で課題で使おうっかなー♪