Team Japan

DBArtisan で SQL Server のロックを分析・改善する

高橋(智)です。
今日は、MS SQL Server 2005(2008)で発生したパフォーマンス問題を「DBArtisan」と使って分析・解決してみようと思います。
まず、以下のように2つのアプリケーションがあるとします。片方を「Application X」として、このアプリケーションは複数行(10000万行)をUPDATE文を使って更新するものです。先日同様、大量のトランザクションを1つにまとめることでパフォーマンスが改善したことを思い出して、dbExpressで適切なコードを書いてみました。そしてもう一方の「Application Y」は、同じテーブルの内容をDBGridに表示するフツーのアプリケーションです。し・か・し、表示するまでに長時間待たされてしまいます。どちらも、デフォルトのトランザクションの分離レベル「READ COMMITTED」を選択しているのですが…。

 

では、TDBGridに表示するだけのアプリケーションが長時間待たされる問題の原因を、DBArtisanを使って探してみます。DBArtisanで、接続しているユーザーのロック状況を確認すると、以下のように排他モードでロックを握ったままのUPDATE文が複数発見できます。また、共有モードでロックを獲得しようとして、待たされているSELECT文も発見できました。

 

問題の原因は分かりましたが、どうすればよいでしょうか… 実は、SQL Server 2005以降では、分離レベル「READ COMMITTED」のモードとして「SNAPSHOT(スナップショット)」が搭載されています。以下のように、
ALTER DATABASE データベース名
SET READ_COMMITTED_SNAPSHOT ON;
GO
を実行してデータベース構造を変更すると、アプリケーションのコードはそのままで、SELECT文の結果をすぐに取得できるようになります。この READ COMMITTED の SNAPSHOT モードによって、1レコードあたり14バイト程度の管理領域を追加して、行のバージョニングが可能になるのです。

これで、DBGridにテーブルの内容をレスポンス良く表示できるようになりました~。

Posted by Tomohiro Takahashi on February 9th, 2010 under Database, Delphi | Comment now »


DB Optimizer で dbExpress のパフォーマンスを改善

高橋(智)です。
今日は、「DB Optimizer」を使ってパフォーマンス問題の発見/コードの改善/検証を行ってみようと思います。
例として、「Delphi/C++Builder 2010 の dbExpress を使用して、Oracle10gに接続し、10000行もの行挿入を行うコード」を取り上げます。まずは以下のコードを見てください。いたってフツーのforループで、10000回のINSERT文を発行していますね。もちろんこのコードは正しく動作しますが、時間がやたらとかかります。

では早速、DB Optimizer を使ってOracleに接続し、プロファイリングを実施してみます。下記の図は、10000行のINSERT時にかかった時間とその内訳です。どうも「log file sync」という処理が多発しているようですね。Oracleのlog file syncを調べると、トランザクションのコミットに関する処理のようです。

実は、先程のdbExpressのコードでは、10000行のINSERTに伴い、暗黙のうちに大量のトランザクションが発生しています。1行をINSERTするたびにコミットを行えば、処理が遅くなるのも当然でしょう。そこで、dbExpressのTSQLConnectionの「BeginTransaction/CommitFreeAndNil」メソッドを使用して、処理全体を1つのトランザクションにまとめて見ました。以下のようなコードになります。

ではもう一度 DB Optimizer を使ってOracleに接続し、プロファイリングを実施してみます。いかがですか? 処理時間が劇的に短くなりましたね~。30秒以上もかかった処理が、5秒に短縮されました。

Posted by Tomohiro Takahashi on February 4th, 2010 under C++, Database, Delphi, Java, PHP, Ruby | 1 Comment »


CORBA: ACE+TAO 5.7.6 リリース

高橋(智)です。
先日、C++Builder 2010 向けのHotfix 1がリリースされましたが、それに合わせて、オープンソースのC++のCORBA実装「ACE+TAO」の最新版5.7.6がリリースされまして、ようやくC++Builder 2010のサポートが追加されました。
http://www.dre.vanderbilt.edu/~schmidt/DOC_ROOT/ACE/NEWS

メンテナンスをされているRemedyITの方には本当に感謝いたします。

ACE+TAOの使い方などは、以前のデベロッパーキャンプで解説した以下の資料を参考にしてください。
[参考: オープンソースを利用した 3層C/Sシステムの構築方法]
http://www.borland.com/resources/jp/pdf/events/2nd_devcamp_06.pdf

Posted by Tomohiro Takahashi on February 2nd, 2010 under C++ | Comment now »


VCL for PHP と Firefox 3.6 - Rev.276

高橋(智)です。
先日、Firefoxの最新版 3.6 がリリースされましたが、その3.6のリリースに伴い、Delphi for PHP(VCL for PHP)で作成しているアプリケーションが動作しなくなった方もいらっしゃるかもしれません。VCL for PHPに搭載されているJavaScriptフレームワーク「Qooxdoo」の qx.js ファイルの実装の問題で、例えば DBGrid の編集機能が動作しなくなってしまいました。
[Firefox 3.6 and DBGrid]
http://qc.embarcadero.com/wc/qcmain.aspx?d=81633
なお、この問題は、VCL for PHPの最新リビジョン276で修正されています。
必要な方は
http://vcl4php.svn.sourceforge.net/viewvc/vcl4php?view=rev&revision=276
から修正版のqx.jsをダウンロードして、既存のqx.jsと置き換えてください。
また、リビジョン276全体をTAR.GZ形式でダウンロードするには、
http://vcl4php.svn.sourceforge.net/viewvc/vcl4php/trunk/vcl/
の最下部にある「Download GNU tarball」のリンクを使用してください。

Posted by Tomohiro Takahashi on February 2nd, 2010 under Database, PHP | Comment now »


TTimerコンポーネント

高橋(智)です。
昨年リリースされた Delphi/C++Builder 2010 の最新アップデートリリース(Update4)ですが、そのリリースに伴い、皆さんが良く利用されているであろう「TTimerコンポーネント」の実装の一部が変更になっています。
そもそもTTimerコンポーネントはGUIベースのタイマーなのですが、タイマーを開始する「TTimer.SetEnabled := True;」というメソッドの処理が変更(遅延初期化を導入)されています。GUIのメインスレッドではなく、ワーカースレッド内でTTimerコンポーネントを操作しているコードがある方は要注意です。タイマーが起動しなくなってしまうこともあると思います。
詳しくは以下のQualityCentralのページなどを見てください。
[Changing TTimer.Enabled from thread does not work anymore since Update 4 for Delphi 2010]
http://qc.embarcadero.com/wc/qcmain.aspx?d=81256
[RAD Studio 2010 IdTCPServer1Execute Error ( After latest updates)]
http://qc.embarcadero.com/wc/qcmain.aspx?d=80376

Posted by Tomohiro Takahashi on January 21st, 2010 under C++, Delphi | Comment now »


VCL for PHPでAjax - JavaScriptコードを送り返す

高橋(智)です。
以前このBlogで、VCL for PHPのAjax処理に関するTipsを書きました。
[VCL for PHP で Ajax を使う - 処理中だけアニメーションGIF表示]
http://blogs.embarcadero.com/teamj/2009/11/21/860/
こんどは、Ajaxの処理が完了してWebブラウザにレスポンスが帰ってきたタイミングで、特定のJavaScriptコードを実行させてみようと思います。この場合のJavaScriptは、サーバーのPHP側から送り返されたコードになります。

1. 画面にEdit(Name=Edit1)とButton(Name=Button1)を配置します。

2. PageのEncodingプロパティをUTF-8に変更します。
3  PageのUseAjaxプロパティをtureに変更します。
4. Button1のButtonTypeプロパティをbtNormalに変更します。
5. Button1のJavascriptイベントOnClickに「Button1JSClick」というイベントハンドラを割り当て、以下のように記述します。

6. PHPコードにAjaxとして処理するメソッド「function ajaxtest($sender, $params)」を定義します。このajaxtestメソッドは、AjaxとしてWebブラウザから呼び出されますが、Ajax処理後にWebブラウザ内で任意のJavaScriptコードを実行させたい場合には、以下のいずれかで可能です。

その1.
VCL for PHPのAjax機能の土台をなす「xajax」の「xajaxResponseクラス」のインスタンスは、VCL for PHP内では「グローバル変数 $ajaxResponse」として利用可能ですので、その「addScriptメソッド」に自前のJavaScriptコードを追加します。

その2.
上のその1のようにJavaScriptコードを送り返す場合、Webブラウザ側では本来のAjax処理の前にJavaScriptコードが実行されます。そうではなく、本来のAjax処理の後でJavaScriptコードを実行したい場合には、Pageの「OnAfterAjaxProcessイベント」を利用します。

Posted by Tomohiro Takahashi on January 19th, 2010 under PHP | Comment now »


Delphi/C++Builder 2009向けHotfix 3 for IntraWeb 10

高橋(智)です。
長い間、Delphi/C++Builder 2009に付属しているIntraWebには、マルチバイトの処理に問題が残っていて、パッチの.pasファイルが提供された一部のユーザーの方を除いて、IntraWebを活用することが難しかったのですが、本日ようやく
[Hotfix 3 available for 2009 versions of Delphi, C++Builder and RAD Studio]
http://edn.embarcadero.com/en/article/40331
が一般に提供されるようになりました。

Delphi/C++Builder 2009の登録ユーザーの方は、上記のHotfix 3をダウンロードし、同梱されている「UTF8ContentParser.pas」をプロジェクト内にコピーして追加する必要があります。
また、IntraWebの最新版 Ver10.0.21 をAtozed社のWebサイトよりダウンロードし、必要があればキーの発行を依頼する必要もあります。
http://www.atozed.com/Intraweb/Download/Download.EN.aspx

なお、今回のHotfix 3を利用する場合、Delphi/C++Builderのプロジェクトでは「実行時パッケージ」を「使用しない(OFF)」に設定する必要があります。その他詳しい手順については、上のWebページまたは同梱されている「readme_RADStudio2009HF3.txt」を参照してください。

Posted by Tomohiro Takahashi on January 19th, 2010 under C++, Delphi | Comment now »


Michael Rozlogの「RAD Studio 2010 ビデオシリーズ」

Michael Rozlogが自身の Blog でアナウンスしておりますが、RAD Studio 2010に関するショートビデオが公開されています。
どれも短いビデオでピンポイントな機能紹介です。

「あーこうやるのか」というヒントにもなるかと思います。是非、ご覧下さい。

Posted by Chikako Yonezawa on January 12th, 2010 under C++, Delphi | Comment now »


1/14(木)はWebセミナーの日 - 詳細!DataSnap

高橋(智)です。
昨年末に、DataSnap 2010に関するホワイトペーパーの日本語翻訳版を公開しまして、 以下のWebサイトなどからダウンロードできるようになっています。
[Delphiユーザー必見の技術情報を集約した「Delphi 2010 DataSnap活用ガイド」]
http://codezine.jp/article/detail/4741
http://codezine.jp/article/detail/4741?p=2

さらに、来週の1/14(木)には、前回のデブキャンプで行ったDataSnapに関するセッションをWebセミナー形式でもう一度行います。
[Webセミナー「詳細!DataSnap」]
http://edn.embarcadero.com/jp/article/40304

ただ、そのままリプレイするだけではつまらないですよね? Delphi 2010/C++Builer 2010のアップデートが12月のデブキャンプの開催に間に合わなかった都合で、説明できなかったトピックも紹介しようと思っています。REST(ful)なアクセスが可能なDataSnapサーバーを、IIS上のISAPI形式DLLとして稼動させ、Webブラウザ内からAjaxを通してマルチバイト文字列を渡したり、JSON形式のデータの受信を行ってみようと思います。
なお、Ajaxのアクセスには、とても便利なJavaScriptライブラリの「jQuery」を利用しようと思っています。
お楽しみに~。

Posted by Tomohiro Takahashi on January 7th, 2010 under C++, Delphi, Event, PHP, Ruby | Comment now »


IntraWeb Ver10.0.21 がリリースされました

高橋(智)です。
なかなか安定版がリリースされなかった「IntraWeb(VCL for the Web) Ver10」ですが、つい先日様々な問題を解決した最新版「Ver 10.0.21」が正式リリースされました。
下記のAtozed社のWebサイトから「iw10.0.21.exe」をダウンロード可能です。
[Atozed Software - Downloads]
http://www.atozed.com/Intraweb/Download/Download.EN.aspx
なお、Delphi 2010/C++Builder 2010/RAD Studio 2010の登録ユーザーは、バンドル版としてのライセンスをAtozed社から発行してもらう必要があります。
[Free Key Request]
http://www.atozed.com/Intraweb/Download/FreeKeyRequest.EN.aspx

Atozed社からライセンスがメールで届きますので、IntraWebのインストール時にそれを入力します。インストール後、IDEを起動したら、以下の作業を必ず行ってください。
1. Delphi 2010の場合、[環境オプション]-[Delphiオプション]-[ライブラリ - Win32]-[ディレクトリ]-[ライブラリパス]の中に列挙されているライブラリパスを確認し、IntraWebをインストールしたフォルダが先頭に来るようにします。

2. C++Builder 2010の場合、[環境オプション]-[C++オプション]-[パスとディレクトリ]-[ライブラリパス]の中に列挙されているライブラリパスを確認し、IntraWebをインストールしたフォルダが先頭に来るようにします。さらに、プロジェクトオプションのビルド構成の「Base」で、インクルードパスのリストの先頭にIntraWebをインストールしたフォルダを追加します。

 

3. IntraWebのライセンスやビルド設定が正しく行われると、IntraWebアプリケーション実行時に、以下のように表示されるはずです。

 

なお、Delphi 2009 / C++Builder 2009 の場合、今後リリースされるであろうHotfixが別途必要となりますので、それまでしばらくお待ちください…。

Posted by Tomohiro Takahashi on December 29th, 2009 under C++, Delphi | Comment now »




Server Response from: blog1.codegear.com