データベース技術 12(database 12)
TRANSCRIPT
データベース技術第12回(2015.12.15)
115年12月15日火曜日
データベースとプログラム•プログラムとデータの独立性
- SQLでデータベース処理を行うことにより、プログラムとデータを分けて考えることが可能
-生産性の向上につながる
データベース
DBMSプログラム SQL
215年12月15日火曜日
プログラミングインタフェース•プログラムとデータベースの間でデータをやりとりするもの•API(Application Programming Interface)
-プログラムをアプリケーションプログラムと呼び、 そのインタフェースなので、APIと呼ぶ
•APIの具体例- Oracle:C言語から呼び出すOCI- PostgreSQL:C言語から呼び出すlibpq問題点:汎用性に欠ける→データベースが変わるとプログラムの変更が必要
315年12月15日火曜日
プログラミングインタフェース
データベース
ライブラリ RDBMS1
データベース
ライブラリ RDBMS2
データベース
ライブラリ RDBMS3
ソフトウェアC
クライアントAPI①
ODBCまたはJDBC API②
API③
-製品が異なっても 同じインタフェースを使用できる
415年12月15日火曜日
ODBCとJDBC•ODBC(Open Database Connectivity)
-これに従いデータベースベンダがODBCドライバを提供-ハードウェアやOSの違いを意識せずに済む
•JDBC- Javaプログラミング用につくられたAPI- JDBCを使うとデータベースを意識せずにアクセス可能- JDBCの4つのタイプ
• ODBC Bridge Driver(TYPE 1)• Native-API Partly-Java Driver(TYPE 2)• Net Protocol All-Java Driver(TYPE 3)• Native Protocol All-Java Driver(TYPE 4)
515年12月15日火曜日
Webとデータベースの例•Twitter API
- Twitterの情報を利用することができる
-例:ウィジェット
ここのソースコードをWebサイトに貼付けるとWebサイトにツイートが表示される
615年12月15日火曜日
Excelとデータベース•Excelでは、データベースからデータ取得可能
•外部データ参照機能を使う
•この機能では、ODBCが使われている
•例-データベースにある売上データをExcelに取り出し、グラフ化
715年12月15日火曜日
Microsoft Accessとデータベース•小規模なデータベースシステム構築が可能•利点
-フォーム機能を使って簡単にアプリケーションプログラムが作成できる
-細かい制御はVBA(Visual Basic Application)を利用
•Accessをフロントエンドとすることができる-フロントエンド:画面の機能(Accessで作成)-バックエンド:データベスの機能(Oracleなどの大規模データベースを使用)
815年12月15日火曜日
APIの補足説明•「データベースを意識せずにアクセス可能」
-データベースのベンダーを気にしなくてもOK
-データベースの細かな接続方法を気にしなくてもOK
•アプリケーションプログラムでやること-データベースに接続する
- SQL文を組み立てる
- SQL文の実行結果を受け取り、操作する※ソースコードで書く内容 = 人間がコマンドラインで行うこと
915年12月15日火曜日
•Javaのソースコード(前半)
JDBCの例(1)
import java.sql.*;public class Fruits{
public static void main(String args[]){
try{String drv = “com.mysql.jdbc.Driver”;String url = “jdbc:mysql:/// fruitsdb”;String usr = “”;String pq = “”;
Class.forName(drv);Connection cn = DriverManager.getConnection( url, usr, pw );
Statement st = cn.createStatement();String qry = “SELECT * FROM fruits”;
ResultSet rs = st.executeQuery( qry );
SQL文を作成
SQL文を実行し、結果を受け取る
データベースに接続
JDBCドライバを宣言
JDBCドライバを設定
接続先のデータベースを宣言
1015年12月15日火曜日
•Javaのソースコード(後半)
• ソースコードでは、JDBCを使うことを宣言するのみ
• その後はデータベースの種類を意識せずにSQL文と結果を操作している
JDBCの例(2)
ResultSetMetaData rm = rs.getMetaData();int cnum = rm.getColumnCount();
while( rs.next() ){for( int i =1; i <= cnum; i++; ){
System.out.print( rm.getColumnName( i ) + “--” + rs.getObject( i ) + “ “;}System.out.printlin( “”);
}・・・省略
}SQL文の実行結果を
1行ずつ表示
1115年12月15日火曜日
Rubyプログラムの補足require "sqlite3"
db = SQLite3::Database.new("database.db")
sql = "create table Item (商品コード integer primary key, 商品名 text, 価格 int)"db.execute(sql)puts "Itemテーブルを作成しました。"
db.transaction do sql = "insert into Item values (?, ?, ?)" db.execute(sql, 101, "メロン", 800) db.execute(sql, 102, "いちご", 150) db.execute(sql, 103, "リンゴ", 120) db.execute(sql, 104, "レモン", 200)end
db.execute2("select * from Item") do | row | puts row.join("\t")end
db.close
インスタンスの生成db:インスタンス名
<インスタンスとは> ・プログラムを動かすための部品。 ・「オブジェクト」とも呼ばれる。 ・インスタンスには、様々な「メソッド」 が用意されている。
<メソッド> ・インスタンス自身に対する操作 ・メソッドの使い方:「インスタンス名.メ ソッド名(引数)」
変数:値を覚えておく入れ物
変数
1215年12月15日火曜日
データベースの運用•トランザクション機能
•同時実行制御
•セキュリティ
1315年12月15日火曜日
トランザクション機能(1)•トランザクション
-データの登録や更新の1サイクルのこと
•トランザクション機能-トランザクションを保証する機能
-データベースに下書きをし、矛盾がなければ更新する
-処理の始めに「トランザクション開始」を宣言
-処理の修了時に「トランザクション終了」を宣言
-トランザクション終了時にDB更新を行う1415年12月15日火曜日
トランザクション機能(2)
データベース
読み出し
書き込み
A
A
トランザクション・データ登録・データ更新
1515年12月15日火曜日
トランザクションの性質(1)•データベースに矛盾が生じる可能性
-多数のユーザによる利用-トランザクションの実行中に障害が発生
•ACID属性(ACID properties)-矛盾を防ぐためにトランザクションに要求される性質
1615年12月15日火曜日
トランザクションの性質(1)•ACID属性(ACID properties)
-矛盾を防ぐためにトランザクションに要求される性質
性質 内容 意味
A(Atomicity) 原子性トランザクションは、コミットかロールバックのいずれかで終了しなければならない
C(Consistency) 一貫性トランザクションを実行した時、データベースの一貫性は損なわれない
I(Isolation) 独立性トランザクションを並列的に処理した場合であっても、逐次処理した場合と同一にならなければならない
D(Durability) 耐久性完了したトランザクションの内容は、障害によって損なわれない
1715年12月15日火曜日
原子性(Atomicity)•トランザクションはコミットかロールバックで終了する-コミット(commit):トランザクション処理を確定させるための指示
-ロールバック(rollback):トランザクション処理を取り消すための指示
データベース
A
Aコミット
データベース
A
Aロールバック×
1815年12月15日火曜日
コミットとロールバック•自動的に行われる場合
-データベースシステムで自動的に処理される
•明示的に発行する場合-エラーの有無により、トランザクション処理を変更したい場合など
- SQL文:COMMIT文とROLLBACK文がある
COMMIT;
ROLLBACK;
1915年12月15日火曜日
一貫性(Consistency)(1)•トランザクション操作の前後で矛盾が発生しない
•資源(resource)-トランザクション操作の対象となる表や行の単位
•データベースの一貫性を保つとは-トランザクションが同じ資源に並列的にアクセスしても、矛盾がないようにすること
2015年12月15日火曜日
一貫性(Consistency)(2)•更新の喪失(lost update)
-一貫性が保たれない現象-例:りんごの数は何個?
りんご30個
A
A
① 30個
+10個
④ 40個 りんご40個?
B
B
+10個
② 30個
③ 40個A、Bがそれぞれ10個足したらりんごの数は50個になるはず
2115年12月15日火曜日
独立性(Isolation)•直列可能(serializable)
-複数のトランザクションが並列処理されても、これを逐次処理した場合と同じ結果となること
•トランザクションの独立性-スケジュールが直列可能であることを要求している
•スケジュールを直列可能とするために-同時実行制御が必要となる
2215年12月15日火曜日
同時実行制御•データベースへのロック(lock)を使った制御
-共有ロック(shared lock):データの読み出し時-排他ロック(exclusive lock):データの書き込み時
• 共有ロックがかかっているとき、他のトランザクションは共有ロックを かけられるが、排他ロックはかけられない
• 排他ロックがかかっているとき、共有ロックも排他ロックもかけられない
共有ロック 排他ロック
共有ロック
排他ロック
○ ×× ×
ロックの両立関係
2315年12月15日火曜日
2相ロックで直列可能を保証•2相ロック(two-phase locking)
-ロックの設定と解除に関する一定の規約のひとつ-トランザクションをロックをかけていく相と、ロックを解除していく相から構成する
LOCK ALOCK BREAD AREAD BWRITE AWRITE BUNLOCK AUNLOCK B
2相ロックに従う場合LOCK A READ AWRITE AUNLOCK ALOCK BREAD BWRITE BUNLOCK B
2相ロックに従わない場合
ロックをかける相
ロックを解除する相
ロックを全部かけ終わる前にロックを解除している
2415年12月15日火曜日
ロックの粒度(granularity)•ロックをかける範囲のこと:表 単位で、行 単位で•ロックの粒度を大きくする
- 1つのトランザクションがロックをかける回数が減る• ロック管理の手間を減らせる => CPU負荷が減る
-ロックの解除を待つ時間が長くなる• 同時に実行可能なトランザクションの数は減少
•ロックの粒度を小さくする- 1つのトランザクションがロックをかける回数が増える
• ロック管理の手間が増える => CPU負荷が増える
-ロックの解除を待つ時間が短くなる• 同時に実行かのうなトランザクションの数が増大
2515年12月15日火曜日
ロックによる制御の課題•デッドロック(dead lock)
- 2つのトランザクションが,互いに相手の所有するロックが解除されるのを待機して処理が進まなくなる状態
-例:口座間の振込処理
口座番号 残高
1001 11,200
2002 2,100
トランザクション1 トランザクション2
①口座番号1001の残高を10,000減らす
③口座番号2002の残高を10,000増やす
②口座番号2002の残高を2,000減らす
④口座番号1001の残高を2,000増やす
ロックロック
× ×
2615年12月15日火曜日
その他の同時実行制御•時刻印制御(timestamp control)
-アクセスするデータにタイムスタンプを与える-より新しいタイムスタンプを持つトランザクションがデータを更新していた場合は、データの読み書きを許可しない
•楽観的制御(optimistic control)-とりあえず各トランザクションの読み書きを許可-書き込む時に初めて、他トランザクションによる更新がなされていないかを確認する
-他トランザクションが更新していたらロールバック2715年12月15日火曜日