投稿

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

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

イメージ
今日、やったこと C#のusingステートメント C#+オラクルでトランザクション実装 今日のホワイトボード C#のusingステートメント DBアクセスプログラムに便利なusingステートメントの紹介。 要はJavaのtry with resources。 古典的なプログラミング finally{}ブロック内でコネクション等をクローズする。 図 古典的なDBアクセスプログラム usingステートメントを使う using()内で宣言、生成したインスタンスはusing(){ }ブロックを抜ける際に、Dispose()が呼び出される。 Dispose()内ではclose()を実行しているため、結果的にDBをクローズすることができる。 図 usingステートメントを使ったDBアクセスプログラム ※プログラム先頭のusingは Javaのimportのように、名前空間(Javaのパッケージ)をインポートする際に利用するのは usingディレクティブ 。 C#+オラクルでトランザクション 基本的な流れはJavaと同じだが、Transactionオブジェクトに注意。 図 トランザクション処理を行うプログラム ソースコードを挙げておきます。 サンプルアプリケーション3 Webアプリケーション版のトランザクションサンプルを作成しました。 ポイントになるソースを挙げておきます。 ItemDAOクラス Index.cshtml Index.cshtml.cs

10月15日(木)3、4コマ目

イメージ
今日、やったこと 更新時に手動でロックするWebアプリケーション作成 今日のホワイトボード ページ遷移の違い フォワードとリダイレクトの2種類がある。 フォワードは ページ遷移がサーバー側で完結する 。 よって、クライアント側のリクエストURLは変わらない。 リダイレクトはクライアントに遷移先ページを再度リクエストさせる 。 図 ページ遷移(フォワードとリダイレクトの違い) execute()メソッド(PreparedStatementクラス) 実行するSQL(参照系か更新系か)、SQL実行結果(ResultSetが返ってくるか否か)で戻り値が異なる。 図 execute()メソッドの戻り値 今回のアプリケーションの画面について 複数のボタン、テキストボックスがあるが、 どのボタンが押されたかがわかる必要がある ボタンが押された行のテキストボックス入力値を取得する必要がある のため、ちょっと工夫が必要。 図 画面のポイント 今日のソースコード ItemDAOクラス(ItemDAO.java) ロックするには、ロック対象行を取得するSELECT文の最後にFOR UPDATEをつけて実行。 なお、SELECT文なので、検索結果を取得することもできる。 IndexSrvクラス(IndexSrc.java) サーブレット。 index.jsp JSPページ。

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

イメージ
今日、やったこと Web版Javaのトランザクションプログラム実装 今日のホワイトボード パッケージ階層 アプリケーションの階層分けとパッケージを一致させている。 図 パッケージと階層 sessionオブジェクト取得 HttpServletRequestクラスのgetSession()メソッドでsessionオブジェクトが取得できる。 ただ、引数とセッションの状態で戻り値が異なります。 図 sessionオブジェクト取得方法 新規にセッションがスタートできるのはgetSession(true)のみです。 価格用テキストボックス テキストボックスの名前(name属性)でどの商品(ID)がわかるように、itemid_xxにしている。(xxはID) 図 価格用テキストボックス サーブレットでは ①受信データの全パラメータ名取得  HttpServletRequestのgetParameterNames()を利用。  戻り値はEnumeration<String>。 ②取得した全パラメータ名からテキストボックスのname属性と一致するものを探す  name属性は itemid_xx(xxはID)。  あいまい検索で名前がitemid_xxを探す。  Stringクラスにはmatches()メソッドがあり、引数に正規表現を使えばあいまい検索もできる。 ③テキストボックスの名前から入力値を取得  ここはいままでと同じ。  HttpServletRequestのgetParameter()を使う。 ④テキストボックスの名前からIDを取り出す  テキストボックスの名前はitemid_xx。  _で分割すればいい。  Stringクラスにはsplit()メソッドがあり、分割することができる。 今日のソースコード ItemDAOクラス DBアクセスクラス。 update()は引数のリストの内容でトランザクションテスト1テーブルを更新する。 もし、1つでも更新に失敗したら、全更新をキャンセル(ロールバック)。 すべての更新が成功したら全更新確定(コミット)。 IndexSrvクラス サーブレット。 更新ボタンクリック時にdoPost()を実行。 全商品の価格データが送...

10月7日(木)3、4コマ目

イメージ
今日、やったこと Javaでトランザクション実装 今日のホワイトボード JDBCのデフォルト設定 SQLを実行するたびに、コミット実行。 図 JDBCのデフォルトではSQL実行毎にコミットする そのため、複数のSQL実行後、コミットするまたはロールバックすることができない。 Javaでトランザクション実装 ①自動コミット機能をオフ setAutoCommit(false) で自動コミット機能を無効にする。 ②コミット実行 トランザクションのSQLがすべて実行したあとでコミット実行。 ③ロールバック実行 SQL実行時にエラーが発生すると、例外がスローされる。 よって、 try{ }ブロックでSQL実行 catch{ }ブロックでロールバック でSQL実行に失敗するとロールバックできる。 図 コミット、ロールバックの実装 ここまでの実装ではコネクションをクローズしていない 〇古典的な書き方 古典的な書き方ではfinally{ }ブロックでクローズする。 図 finally{}ブロックでDBクローズ 〇Java7以降(リリース:2011年) Java7で追加されたtry with resourcesを使うと明示的にクローズしなくてもいい。 図 try with resourcesで自動クローズ ロックする ロック対象行が取得できるSELECT文にFOR UPDATEをつけて 実行。 コミット、ロールバックするまでロックされる。 今日作ったソース いちおう挙げておきます。

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

イメージ
今日、やったこと トランザクション 今日のホワイトボード よくあるトランザクションの説明(原子性) 1トランザクションは複数の更新系SQLで構成されるケースが多い。 トランザクション終了時には SQLがすべて成功 SQLはすべてキャンセル のいずれでなければならない。 これがトランザクションの 原子性 。 図 よくあるトランザクションの説明(トランザクションの原子性)  コミット、ロールバック トランザクションの原子性を確保するために コミット 、 ロールバック がある。 コミットは全ての更新を確定する ロールバックは全ての更新をキャンセルする 図 コミット、ロールバック トランザクションの独立性 複数のトランザクションが同時に実行されても、互いに影響を及ぼさないようにトランザクション同士を分離して独立性を確保する。 ただ、トランザクション同士の分離レベルが、全く分離しない(Read Uncommitted)から、ほぼ完ぺきに分離(Serializable)まで4段階ある。 この分離レベルによっては他トランザクションにいろいろな影響(ダーティーリード、ファジーリード、ファントムリード)を及ぼすことがある。 〇ダーティーリード 他トランザクションが更新したがコミットしていないデータを参照してしまう状態。 図 ダーティーリード 多くのデータベースはトランザクション分離レベルがRead Committed。 Read Committedでは、非コミットデータは別トランザクションには見せないようになっている。 図 トランザクション分離レベル「Read Committed」 〇ファジーリード 他トランザクションが更新することで、同じ行のデータが検索ごとに値が異なる状態。 〇ファントムリード 他トランザクションが更新することで、検索ごとにデータ件数が異なる状態。 ロック DBは更新時に対象行をロックする。 ロックすれば、他接続からはロックできない。よって、更新ができない。 ロックはコミット、ロールバックで解除される。 図 ロック 手動でロック ロック対象行を取得するSELECT文にFOR UPDATEをつけて実行すると、ロックができる。 更新時の(DBが実行する)自動ロックではダメな場合に利用。 コミット、ロールバックでロックは解除される。 図 手動ロック 次回は Ja...