frei

旧「anney's room」からブログ「frei」だけ引っ越し&残しました

DAOの入れ子とRandomStringUtils。

悩むなぁ、くそー。

何故なんだ、何故予想通りに動かないんだぁぁぁ。

 

って訳で、金曜から悩み続けたJTA関連の

コネクションリーク起こしてるルーチンですが、

調べた結果、仮説ができました。

いや、あくまで仮説なんだけど(^_^;

 

なんたって、へなちょこプログラマですから。

言う事鵜呑みにしないでね。てへ。

 

おまけ。

 

Java並列プログラミングTips

濃度濃いなぁ、このページ。

マルチスレッドについて、改めて勉強するのに見てみたんだけども。

 

メンバ変数の宣言

今更基本ですが。メンバ変数なんかにつける属性で

よく使うのは、static, final ですが、その他知らないヤツについて。

transient:変数がオブジェクトの持続性のある状態ではない

volatile:変数が非同期に変更される

 

重複投稿/submitを防ぐトランザクショントークンという考え方

なるほどねぇ…しかしうまく機能しない。何故だ。

スレッドがうまく1つ1つをこなしてないような気がする。

synchronized をかけてるんだけど、何故なんだ。

いや、それはちゃんと理解してないからだ>自分つっこみ

 

Balkingパターン

GoF以外のデザインパターン

結城さんのところです。

 

セキュア・プログラミング講座

Javaのみならず、PerlASPも載ってるでよ。

 

synchronized とレースコンディション

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

 

日本初!編曲できるCD

いいですねぇ、いいですねぇ。

U2のCDで遊んでみたいなぁ。

 

 

 

 

やってる事は、簡単(?)に言うと

DAOの入れ子状態。

って、もし言い方が変でも許して。

専門用語、弱いんだよねぇ…(^^;

 

やってる事↓。

 

 

 

 

 

 

  • begin()

 

 

  • AaaDAO中でSQL実行

 

 

 

 

  • BbbDAO中でSQL実行

 

 

 

 

  • 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文字なだけで

勿論、文字数は調整可能。

 

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