投稿

10月, 2020の投稿を表示しています

10月27日(火)1、2コマ目

イメージ
今日、やったこと C#でオラクルDBアクセス(ODP.Net Core) 今日のホワイトボード JDBCとADO.Net、ODP.NET これから使うODP.NETは.NetFrameworkからオラクルアクセスに特化したライブラリ。 図 JDBCとADO.NET、ODP.NET C#でオラクルアクセス 全件検索(finallyでクローズ) finallyで必ずクローズさせる古典的なやり方。 授業では今後このやりかたは使いません。 全件検索(usingを使う) 名前空間をインポートするためのusingとは異なり、こちらのusingはブロックを定義するためのもの。 using()内で宣言したインスタンスはusing{}ブロック終了時に自動的にDispose()が実行される。 図 Javaのtey with resourcesとC#のusing 更新(トランザクション) 基本的な流れはJavaと同じ。 〇SQLのパラメータマーカーとParameterオブジェクト パラメーターマーカー(Javaでは?)は:パラメーター名。 CommandオブジェクトのParametersプロパティにParameterオブジェクトをセットする順はパラメータマーカーの順番と一緒にすること。 図 SQLのパラメーターマーカーとParameterオブジェクト 〇トランザクションオブジェクト TransactionオブジェクトはJavaには出てこなかった。 トランザクション制御(コミット、ロールバック)を行う。 ①Transactionオブジェクト取得 接続済みConnectionオブジェクトでBeginTransaction()実行すると取得できる。 ②CommandオブジェクトにTransactionオブジェクトセット 取得したTransactionオブジェクトをトランザクションを構成するSQL実行用Com...

10月26日(月)1、2コマ目

課題(Java版在庫引当)について 一応ソースを公開しておきます。ご参考に。 StockDAOクラス 在庫引当トランザクションを行う。 Serviceクラス これくらいなら別になくてもいいかも。 サーブレット doPost()にて、 ①全パラメータ取得 request.getParameterNames() ②取得したパラメータから名前が"quantity_x"だけ探す if(name.matches("quantity_[0123456789]*") matches()メソッドの引数"quantity_[0123456789]*"は "quantity_"のあとに0から9の0回以上繰り返しが続く という意味になる。 ③パラメータ名"quantity_x"からxだけ抜き出す xは商品のID ④パラメータ名"quantity_x"から値を取得 取得した値が入力された数量 JSP 特になんてことはないかと。

10月19日(月)1、2コマ目

イメージ
今日、やったこと トランザクションの課題 今日のホワイトボード 課題作成上のルール いまさらですが、以下のルールを守ってください。 階層化すること 図 階層化する 〇プレゼンテーション サーブレット、JSPなど。 入力値の取得、表示。必要に応じて、機能実現メソッドを呼び出す。 ここではDBアクセスやシステムが提供すべき機能(検索など)は実装しない。 〇ビジネスロジック 普通のクラス。 システムに必要な機能を提供する。 今回は大した機能はないため、不要。 だけど、本当はトランザクションはここで実装すべき。 〇データアクセス 普通のクラス。 JDBCを使って、データベースアクセスをするのはここのクラスの仕事。 〇データトランスファー 普通のクラス。 フィールド+setter、getterのクラス。 レイア間のデータ受け渡しに使うクラス。 DBアクセス時の例外 基本的に例外はキャッチせず、上位へスロー。 最終的にサーブレットでキャッチ。サーブレットはHttpServletExceptionをスローするため、キャッチした例外をHttpServletExceptionに変換してスローしなおす。 ただし、トランザクション実装部ではSQL実行時に例外がスローされると、ロールバックしなければならない。よって、ここはキャッチ。キャッチ後、ロールバックしエラー内容に応じて対応。 図 DBアクセス時の例外スロー 授業内で紹介したコードは以下のとおり。

10月13日(火)1、2コマ目

イメージ
きょう、やったこと Javaトランザクション(ロック) 演習課題 今日のホワイトボード おさらい Javaでトランザクション実装 基本は下図。 図 トランザクション実装の基本パターン try with resourcesを使うと下図のようになる。 図 try with resourcesでトランザクション実装 くどいけど、オラクルは クローズ時に未コミットデータはコミットする ので注意!! ネットには結構、 クローズ時に未コミットデータはロールバックする と書かれている。 ロック ロックとは、データを排他制御するための仕組み。 データをロックした人(接続)しか、対象データにアクセスすることができなくなる。 ロック済みデータを他の人(接続)がロックすると、ロック解除待ちになる。 DBMSは更新系SQLを実行する際、対象行をロックする。よって、自分でロックする必要は基本的にない。 ただ場合によっては明示的にロックする必要がある。 ロックするには、 ロック対象行を検索するSELECTにFOR UPDATEをつけて実行する だけ。 ロックを解除するには、 コミットまたはロールバック を実行する。 図 ロック 演習課題について 一度に複数商品の在庫引当ができるところがややこしいポイント。 ボタンクリック時にdoPost()メソッドには、すべてのテキストボックス入力内容が送信されるため、どの商品に対する入力かを判断する必要がある。 ヒント あくまでも一案です。このとおりに作る必要はありません。 〇数量入力用テキストボックスの名前は「 quantity_商品ID 」にする これで名前からどの商品のテキストボックスかがわかる。 〇[doPost()にて]まず、送信データのすべての名前を取得 request.getParameterNames() で取得できる。 〇[doPost()にて]取得した名前がテキストボックスのものか判断 名前が「quantity_xxx」なら、数量入力用テキストボックス。 Stringクラスのmatches()メソッドで名前(String型)が「quantity_xxx」とマッチするかチェック。   取得した名前.matches("^quantitiy_.+$") quantity_で始まり(^quantity_) 任意の文字が1文字以...

10月12日(月)1、2コマ目

イメージ
 今日、やったこと トランザクション(Java) 今日のホワイトボード トランザクションとは 1つの機能を実現するための処理=1トランザクション 1トランザクションは複数のDB処理で構成されることもある。 今回のポイントはトランザクションの原子性。 トランザクション終了時は 全更新が成功 1つも更新されていない のいづれかであるべき。 図 トランザクション 今日のソースコード 古典的なトランザクション実装 ループでDBへ登録を行っている。 この処理が 全て成功=>コミット実行 1つでも失敗=>ロールバック実行 を実現するために、 DB更新処理+コミットはtry{}ブロック内に catch{}ブロックにてロールバック実行 になっている。 try with resources利用版 try{}ブロックを抜ける際、自動的にDBクローズされる。 DBクローズの際に、未コミットデータはロールバックされる機能を使えば、明示的にロールバックを行う必要はない。 だがしかし、オラクルは 「DBクローズ時に未コミットデータはコミットする」 仕様のため、これは使えない。明示的にロールバックが必要。