根本解決なしの「逃げ口上」・・・否!いずれ勝負じゃ!

10月 4th, 2013 No comments

これは、トホホなことです。

っま、いつものようにwebアプリの開発環境は、tomcat/spring/hibernate的なモノを使っておりまして、 CRUDに関しては特に、

  • hibernateTemplate.save(hoge);
  • hibernateTemplate.get(hoge);
  • hibernateTemplate.update(hoge);
  • hibernateTemplate.delete(hoge);

を、ゴシゴシと書くわけですね。

で、マスタ系のデータ(CSVファイル)をアップロードして、テーブルに更新するのに、最初のハナシの仕様では「総取り替え」だったので、さらに・・・

  • hibernateTemplate.deleteAll(hoge);

で、コト足りたのです。ザッと単純なフローは、

  1. テーブルのデータ全削除
  2. CSVデータをテーブルにinsert

ははは・・・とても簡単!パイロット版を作って「よっしゃ!」っと、順調でした。

しかし、実際に現場でのヒアリングから、この仕様ではイカンことが判明し、行データ(件数)はCSVを使い、サーバーのテーブルに別途独自に保持された項目はイジラナイ・・・との仕様に変更になりました。

っま、思いついたフローの変更は・・・テーブルに変更Flgを追加しておいて、

  1. テーブルの全データの変更Flgをfalseに(念のため)
  2. CSVデータを順に読み込んで、
  3. 一致データがあれば、必要項目と変更Flgをtrueに更新
  4. 一致データがなければ、必要項目と変更Flgをtrueにしたレコードを追加
  5. テーブルの更新Flgがfalseのものを削除
  6. テーブルの全データの変更Flgをfalseに

っま、こんなもんでしょ。っで、赤丸君 の、1,5,6 の箇所で、使ったのが、

  • this.getSession().createQuery(deleteやらupdateのSQL文).executeUpdate();

みたいなネ。ちょちょいと動作確認できましたよ。おお、順調・ジュンチョウ・・・・。そして、念のため、連続的にアップロード処理を続けてみると、3回目(特定な処理タイミング)で、処理が帰ってこない・・・ガーン!

ログを見ると、ConnectionManagerがJDBCコネクションを開いたところで止まっている。この先はモチロンテーブルに更新が入るハズなのに・・・。

色々調べたら、Hibernateのキャッシュの問題・同一トランザクション内の実更新の順序の問題、っぽいのが気になったので、

  • session.flush();
  • session.clear();

やらを、色々入れて見るもダメ。泣きながら

  • this.getSession().connection().createStatement().executeUpdate(deleteやらupdateのSQL文);

とかに「どーかヒトツ」っと、変更してみても・・・やはりダメ

ああ、こりゃエライ壁にブチ当たってしまった!!!!!

でも、私は「カシコイ卑怯者」なので、以下で誤魔化すコトにした。例えば全フラグをfalseは・・・

List<Hoge> hoges  = hibernateTemplate.find(ぜんぶ);
for (int i=0; i<hoges.size(); i++) {
     hoges.get(i).setFlg(false);
     hibernateTemplate.update(hoges..get(i));
}

ざまあ見やがれ、100回アップロードしても止まらないぜぃ!!!!!

・・・・何十行の処理だからスムけど、これじゃ根本的に解決していない。

ああああ、カユイ。・・・いつかお前を「ヤッツけてやる」。

【だったらイイな】

本番環境で、サーバーやらフレームワークをセットアップしたら、問題なく動作するとか・・・ね。

【ひょっとして】

昨年の春に、解析の相談を受けた某システムが、同じような現象だったなぁ。これだったのカモですね。

【追記】

翌日にフッと気づきました。

  • hibernateTemplate.find(flgがfalseを取り出すSQL);
  • hibernateTemplate.deleteAll(上で取り出したList);

これでも実装できるじゃん。

あと、気になるのは

  • hibernateTemplate.doExecute(hoge);

これをもうチョイ調べれば「解決」があるカモ!

Categories: Mighty構想 Tags:

springを使ったwebアプリをtomcatで複数動かす

7月 16th, 2013 No comments

またこんな楽しい1日を過ごせたので、もう同じ1日を過ごさないようにメモ。

{CATALINA_HOME}\lib\(tomcat全体)と{CATALINA_HOME}\webApps\hogehoge\WEB-INF\lib\(各動作アプリ)のどちらに入れとくのか?っま、とりあえず共通であるtomcat全体に入れて、正常に動作していたのです。(いいね)

で、別のWebアプリを同じtomcat上で平行して動作させようと・・・。これは以前のtomcatと違って、webApps配下にポコンとディレクトリ作れば・・・html文章が見えた・・・ほら出来上がり。

じゃ、springの記述をして・・・あれ?エラーが出ちゃって見えなくなった。

で、ネットで色々探していたら、log4jは各動作アプリのlibに入れとかないと、設定は後出しの方が優先する・・・との記述がありました。

で、やってみると居るはずのクラスが見つからない・・・とのエラー。調べると依存している親元と子供との見え方に可逆性があるラシイ。

そこで、各アプリ毎にローカルで使われたがっていそうな連中を、入れ替えては様子を見たところ、今回のケースで、各アプリのlibに移動させたのは以下の通り。

  • log4j.jar
  • slf4j-api.jar
  • slf4j-log4j.jar
  • spring.jar
  • spring-webmvc.jar
  • hibernate3.jar
  • dwr.jar

半日かかってやっと環境が準備できた。っま、こんなもんだ最初は!

Categories: Mighty構想 Tags:

強引に解決覚え書き

7月 4th, 2013 No comments

DWRのsortableを使って、従属オブジェクト(例えば組織に対する拠点)の順位付けのメンテナンスがカッコ良く出来ていました。で、実際のD/Bテーブルに反映するには、ブラウザ上で表示されている順序で該当する従属オブジェクトの識別子(id)を配列として作成し、それを受け取ったmanagerクラスが、配列を順番通りにループしながら、そのカウンター(概ね「i」ですよね)をそのまま、データ項目の「表示順(私の場合はdisp_order)」に投げ込む。・・・という、「スバラシイ」ロジックで実装していました。

で、困った点

今度は同じ従属オブジェクトでも再帰的な要素(今回は「部署」・・・部・課・係)を同様に処理しようとして、階層の深さの表現(横の位置とか「┣」「┃」「┗」こういうの)をシコシコ作り込んで実装し、いよいよsortableで、ビジュアルにメンテナンス・・・・。ところが今度は上記のように、ザックリと大胆にやるわけにはイカヌ。

sortable処理後に順番が変わるのは移動させたelementだけではなく、抜けたり、割り込まれたりしてシフト(+1 or -1)された連中。もちろん処理対象はツママレタelementなので、上下の順列の規則性から判断しようとしたが、良く吟味すると隣接する2行が入れ替わった結果からは、どちらがツママレタ本人であるのか判断できない。(だって変更は本人だけなんだもの)

で、実際の更新のトリガーになるonUdateとは別にonChangeとかで、ツママレタ(つまりdragされた)行番号なりidなりが取得出来ないか?・・・・と、調べ回ってオオハマリ。

で、逃げた(工夫した)方法

sortableの対象がtableのtrだったので、trにonmousedownイベントで、dragLineという変数に処理前の位置を特定できる(行番号とか)を予めセット。sortableでのonUdate処理で、対象の上から下へループを回し、dragLine(本人)を発見した行がdropLine(安置された場所)ってことで、結構回りくどい処理になっちゃったケド。・・・・っま、悪くもないか?

Categories: Mighty構想 Tags: