ラベル DB2 の投稿を表示しています。 すべての投稿を表示
ラベル DB2 の投稿を表示しています。 すべての投稿を表示

2016年3月6日日曜日

ハロウィーン問題

WikipediaのHalloween Problemこのブログの要約。

ハロウィーン問題はデータベースの更新処理をによって更新されたレコードのデータベース上の位置が変更されることによって、同じレコードが何度も更新されてしまう問題を指す。こんな名前なのは、ハロウィーンに発見された歴史的経緯から。

ポイントとなるのは、

  • テーブルやインデックスのスキャン
  • そのスキャンによって読み込まれるレコードを変更すること
  • 変更によってレコードの位置をこれからスキャンされる位置に移動させること
結果として、スキャンによって更新されたレコードがまたスキャンで読み込まれてしまい再度更新されるという結果になってしまう。

具体的にはカーソルを使った照会と更新を行うときに問題が発生しうる。JDBCを使っている場合もそうだが、カーソルを使った更新をするときには、カーソル更新の結果が照会に反映されるか注意が必要である。

この問題を避けるためには、更新が照会に影響を及ぼさないようにすれば良い。

DB2 9.7.2以降を使っている場合は、カーソルを使用する際には、INSENSITIVE指定をすることで、スキャンの開始時点で照会結果が確定されるので、この問題を避けることができる。

2015年11月21日土曜日

Dockerを使ってMac上にDB2境を準備する

DB2 Express-Cという無償で使えるDB2があるが、残念ながらMacはサポートされていない。
http://www-01.ibm.com/software/data/db2/express-c/download.html

そこでDockerを使って環境を作る。使ったソフトウェアは以下の通り。

  • Docker Machine 0.4.1
  • Docker 1.8.3
  • VirtualBox 5.0.10
インストール手順はいろんなところに書いてあるので割愛。VirtualBoxの仮想マシンを作成が完了した後はこんな感じ。
~ % docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL   SWARM
default            virtualbox   Stopped
~ % docker-machine start default
Starting VM...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.
~ % eval "$(docker-machine env default)"

ここから先がDB2に関係する部分。使うのはibmcom/db2express-c。手順は以下の通り。docker pullで取得するサイズが大きい(1.7GB)のでしばらく時間がかかる。
~ % docker pull ibmcom/db2express-c
~ % docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ibmcom/db2express-c   latest              2abb3b6fc22c        6 months ago        1.705 GB
~ % docker run -it -p 50000:50000 -e DB2INST1_PASSWORD=db2inst1-pwd -e LICENSE=accept ibmcom/db2express-c:latest bash

ここまででDockerコンテナにログインできる。Macからコンテナに50000番ポートで接続するためにはVirtualBox上でのポートフォワーディングも必要。lsofでListenしていることを確認できる。
~ % VBoxManage controlvm default natpf1 "db2_pf,tcp,127.0.0.1,50000,,50000"
~ % lsof -P -i -n | grep 50000

ここまででMacからコンテナに50000番で接続できるようになった。後はDB2側で必要な設定をすればOK。ibmcom/db2express-cに書いてある通りサンプルDBを作ったり、デーモンとして起動したりできる。

サンプルDBの作成
$ su - db2inst1 $ db2start $ db2sampl

デーモンとして起動
docker run -d -p 50000:50000 -e DB2INST1_PASSWORD=db2inst1-pwd -e LICENSE=accept ibmcom/db2express-c:latest db2start

テスト用途ならコンテナの再起動でデータが消えても問題ないことが多いと思われるのでここで作業を終わりにするが、永続化が必要な場合は別途設定が必要。

DockerでMQ環境を作る

DockerHubの ibmcom/mq を使う。ファイルシステムとしてtmpfsは使えないので これ を参考に/mnt/sda1に置き換える。 brew install docker docker-machine docker-machine create --drive...