変奏現実

パソコンやMMORPGのことなどを思いつくまま・・・記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

この画面は、簡易表示です

2013年4月2日

カーソル

MySQLのサンプル 参考URL: http://dev.mysql.com/doc/refman/5.1/ja/stored-procedure-syntax.html

CREATE PROCEDURE curdemo()
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE a CHAR(16);
  DECLARE b,c INT;
  DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
  DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
  OPEN cur1;
  OPEN cur2;
  REPEAT
    FETCH cur1 INTO a, b;
    FETCH cur2 INTO c;
    IF NOT done THEN
       IF b < c THEN
          INSERT INTO test.t3 VALUES (a,b);
       ELSE
          INSERT INTO test.t3 VALUES (a,c);
       END IF;
    END IF;
  UNTIL done END REPEAT;
  CLOSE cur1;
  CLOSE cur2;
END 

ORACLEのサンプル 参考URL http://www.shift-the-oracle.com/plsql/

CREATE OR REPLACE PROCEDURE RIVUS.STEP01_SELECT2(P_DATA_1 IN VARCHAR2)
IS
	CURSOR cDual(P_DATA_2 VARCHAR2 := 'CURSOR param') IS
		SELECT P_DATA_1 COLNAME_1 FROM DUAL
		UNION ALL SELECT P_DATA_2 COLNAME_1 FROM DUAL ;
BEGIN
	FOR vRec IN cDual('xxx') LOOP
		DBMS_OUTPUT.PUT(cDual%ROWCOUNT || ':');
		DBMS_OUTPUT.PUT_LINE(vRec.COLNAME_1);
	END LOOP;
END;
/

同じカーソルでも書き方が全然違うそれがSQL。
似てると云えば、変数宣言はBASIC風なDECLARE文。
何か失敗した場合は、
BEGIN
・・・何か
EXCEPTION WHEN OTHERS THEN
— 画面出力
DBMS_OUTPUT.PUT_LINE(‘エラッた’ || ORA’ || SQLCODE || ‘:’ || SQLERRM);
— ログ出力 error_logs テーブルに書き出す
SIMPLE_LOGGER(SQLCODE, ‘INSERT ERROR’);
END;
/
 
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
・・・
と自動でやってしまう手もあるらしいが更新した後にcommitしないと自動的に・・・
 



Node.js を少し勉強してみた

ここにビギナー向けの記事がある。
単純にサーバーサイドの処理を突っ込むと、ドコかで長い処理があれば、他のリクエストは待ちぼうけになるようだ。つまり、Windows 3.xのようなノンプリエンティブな作りになっているのだ。
apacheみたいリクエストを一個づつスレッド化すれば、サーバーサイドの処理はリクエストごとに独立しソースに書いた通りに綺麗に動くハズだが、同時接続が500くらいになる(つまり同時に存在するスレッドが500を越えると)と、多数のHDDアクセスやらDBアクセスが同時処理となり大混乱になるのは容易に予想でき、ノタノタになるのは目に浮かぶ。apacheを使うなら同時接続数が際限なく増えないようにサーバーサイドの処理は手短に短時間で終わるように作らないといけない。
TomCatはapacheの様にプリエンティブでマルチスレッドだから同時接続数が増えればやっぱりノタノタになるだろう。
一方、ノンプリエンティブなら手短な処理だったら、他の要求はそのままちょっと待たておいて、そのまま処理を実行すれば、リクエストは順次処理されるのでHDDアクセスやらDBアクセスは同時接続するのは1セッションのみのハズで、結果として乱雑なNASや他のサーバーへのアクセスが減り全体としてのパフォーマンスが上がる可能性が出てくる。
仮に同時接続100ぐらいまでなら十分な性能が発揮できる高価なDBサーバーだったら、node server.js をポートを別けて100プロセス実行し、オートバランサーでリクエストを公平にばらまけば、高価なDBサーバーの性能を100%発揮できるだろう。
そして、本当に重い処理(膨大なレコードを参照する年次処理とか、1000ページを越えるPDFファイル作成など)の場合だけ、子プロセスを作り、できればサーバーも別にすればシステムの過負荷時のリスクも相当減ってくる訳だ。
ま、今あるNode.jsをベースにした色んなパッケージがそのように出来ているのかは判らないが、泥臭いチューニングをそのままベタ書きできそうで心強い。
apacheのことを悪く書いてしまった様な気もするが、WEBのフロントエンド、そしてオートバランサーとしてのapacheは使い道がある。TomCatだって裏側で重い処理専用のアプリケーション・サーバーとして利用する分には十分に使えるだろう。
そんな訳で、その中にPHPには不向きで、TOMCATには荷が重すぎる様なサービスをNode.jsで作っていくのは悪いアイデアではない気がする。
多分、一番良くないのは、Node.jsがあれば、apacheもPHPもTomCatも要らないとか言い出すコトだろう。
まずapacheのゴチャゴチャな設定ファイルをNode.jsで作ったポータル用に解析しコンバータを作らないといけないし、本当に要求仕様を満たしているのかわからない大量のPHPやJavaServletのソースを延々とjsに書き直してみたら高価なサーバーだったからコレでも動いていたのか?な、つまらない結果を見ることになるだろう。
※このBlog鯖のapacheの設定ですら結構ゴチャっているだ。
所詮jsの速度が数倍から数+倍になってもネイティブなコードとの差は絶対的である。
さらに簡単なコードだからこそ、GCの性能も十分に出ると考えていいだろう。重厚長大なjsファイルなぞ起動するだけでも使用メモリが恐ろしいコトになる気がする。
 
例えば、身近な例として、
クライアントのIDEとしては普通なフルセットのEclipse IDEをそのまんまサーバーサイドなNode.jsに移植したらどうなるだろう?
プロジェクト全員が使っているIDEであるから、プラグインの入れ替えは深夜作業になるだろう。
どう考えても面倒でも各自のパソコンにIDEを入れて試行錯誤して貰った方が楽に違いない。
例え誰かがパソのIDEをクラッシュさせても、その誰か以外は被害を受けないから・・・プリエンティブな開発環境ですね!
そう考えると、パソコンにインスト不要なNode.jsなサーバーでサーバーサイドなIDE(統合開発環境)とは、開発環境全体がノンプリエティブ化され、たった一つのプラグインのミスもお手上げ状態になりそう。
かなり運用が難しく、色々問題を抱えそうである。
単純にapacheをフロントエンドにしてNode.js なIDEを設定ファイルで切り替えてリロードさせる様な運用をするだけでもかなり現場の雰囲気は違ってくるだろう。
そこが混在させる良さである。
全部Node.jsで作れば、そんなスイッチすら作る考えすら起きずIDEを直結で利用になるだろうね。後で後悔してスイッチ付けるだろうけど・・・
そうならないクラウド(使用も運用もお手軽)なサーバーサイドIDEがあればいいんだけどね。(笑




top