複数のプログラムからのデータベースへのアクセス
Menu Menu
MySQL
MySQL はサーバ型の Database Engine である。これを用いて、複数のプログラムから同時にDatabaseへアクセスする場合の使い方を調べる。
MySQL 上に自分のデータベースとテーブルを作成する
学校の MySQL サーバを立ち上げ、そこに自分のアカウントでデータベースとテーブルの作成を行う。これまで作った例題のデータベースを作成せよ。
Single User での動作の確認
Perl の DBI module を切替えて、MySQL サーバにアクセスし、これまでの動作の確認をせよ。
実行時間の測定
sqlite3 と MySQL では実行時間にどれくらいの差があるかを測定せよ。
問題1
以上の結果をまとめてレポートして報告せよ。
競合状態 (Race Condition)
カウンタを増加させるプログラムを10個並行に動かし、繰り返し動作させる。トランザクションやロックを用いずに、
A SQL によるデータの読みだし B カウンタの増加 C SQL によるデータの書き出しを行って、カウンタの増加が意図したものと異なる場合を再現したい。
問題2
結果が異なる場合の実行の様子をコンパクトにまとめて、レポートせよ。
競合状態の再現
ユーザ1 が動作A を行うことを、
1-Aと書く。続けてユーザ2が動作Aを行うと、
1-A 2-Aとなる。これをトレース(trace)と言う。 分割された実行単位 1-A などを、トランザクションと呼ぶ。
ユーザ1とユーザ2で、競合状態が起きる場合をトレースで示せ。
以下の script を実行してデータベースを作って、
race-condition-0.pl table を作るperl script
race-condition-1.pl 最初のデータを作るperl script
以下の script を平行に実行して競合状態を示せ。
race-condition-2.pl non atomic にカウンタを増やす perl script
問題3
競合状態が起きる場合と、起きない場合を、UML のシーケンス図で示せ。
MySQL の使い方
サーバのIPアドレスとポートを調べる。
外からアクセスできるように Windows のFirewallを設定する (mysql port を開ける)root user からデータベースを作成する。
create database mi070707;できたことを確認する。
show databases;外からアクセスできるユーザを作成する。(root で) root のパスワードは、インストールした人に聞く。
grant all on mi070707.* to kono identifyed by 'password_of_kono'; flush priviledges;新しい mysql では、
mysql> create user kono identified by 'password_of_kono'; mysql> grant all on mi070707.* to kono;とする。
ここまで出来たら、ノートPCから接続してみる。
mysql -h 10.10.122.119 -u kono -p Password:Perl script の以下の port や database を以上で設定したものに変更する。
use DBI; $dsn = "DBI:mysql:database=$database;host=$hostname;port=$port"; $dbh = DBI->connect($dsn, $user, $password);