Symfoware Server アプリケーション開発ガイド(埋込みSQL編) - FUJITSU - |
目次 索引 |
付録B COBOL言語のサンプルプログラム |
マルチスレッド環境で動作するアプリケーションの例を以下に示します。
以下の例におけるスレッドは、すでに他のアプリケーションで起動されているものとします。
000010 @OPTIONS ALPHAL(WORD) 000020 IDENTIFICATION DIVISION. 000030 PROGRAM-ID. sub_threadB. 000040 ENVIRONMENT DIVISION. 000050 DATA DIVISION. 000060 WORKING-STORAGE SECTION. 000070 EXEC SQL BEGIN DECLARE SECTION END-EXEC. 000080 01 SQLSTATE PIC X(5). …… (1) 000090 01 SQLMSG PIC X(255). 000100 EXEC SQL END DECLARE SECTION END-EXEC. 000110 01 ret PIC S9(4) BINARY. 000120 LINKAGE SECTION. 000130 01 ses_id PIC S9(9) COMP-5. 000140 PROCEDURE DIVISION USING ses_id. 000150 000160 INITIALIZE SQLSTATE. 000170 INITIALIZE SQLMSG. 000180 000190 CALL "SQLThrStartID" USING BY VALUE ses_id RETURNING ret. …… (2) 000200 IF ret NOT = 0 THEN 000210 DISPLAY "SQLThrStartIDエラー" 000220 EXIT PROGRAM 000230 END-IF. 000240 000250 EXEC SQL WHENEVER SQLERROR GO TO :CONNECT_ERROR END-EXEC. 000260 EXEC SQL 000270 CONNECT TO 'SI_DB333' …… (3) 000280 END-EXEC. 000290 DISPLAY "CONNECT(SQLSTATE) = " SQLSTATE. 000300 DISPLAY "CONNECT(SQLMSG) = " SQLMSG. 000310 000320 EXEC SQL WHENEVER SQLERROR CONTINUE END-EXEC. 000330 000340 EXEC SQL 000350 INSERT INTO SI_SCHM1.SI_TABLE2 …… (4) 000360 VALUES(1,1,1,1,1,1,1,1,1,1,'R','DD','BBBB') 000370 END-EXEC. 000380 DISPLAY "INSERT(SQLSTATE) = " SQLSTATE. 000390 DISPLAY "INSERT(SQLMSG) = " SQLMSG. 000400 000410 EXEC SQL 000420 COMMIT WORK …… (5) 000430 END-EXEC. 000440 DISPLAY "COMMIT(SQLSTATE) = " SQLSTATE. 000450 DISPLAY "COMMIT(SQLMSG) = " SQLMSG. 000460 000470 EXEC SQL 000480 DISCONNECT ALL …… (6) 000490 END-EXEC. 000500 DISPLAY "DISCONNECT(SQLSTATE) = " SQLSTATE. 000510 DISPLAY "DISCONNECT(SQLMSG) = " SQLMSG. 000520 000530 CALL "SQLThrEndID" USING BY VALUE ses_id RETURNING ret. …… (7) 000540 IF ret = 0 THEN 000550 DISPLAY "SQLThrEndIDエラー" 000560 EXIT PROGRAM 000570 END-IF. 000580 000590 EXIT PROGRAM. 000600 000610 CONNECT_ERROR. …… (8) 000620 DISPLAY "CONNECT(SQLSTATE) = " SQLSTATE. 000630 DISPLAY "CONNECT(SQLMSG) = " SQLMSG. 000640 CALL "SQLThrEndID" USING BY VALUE ses_id RETURNING ret. 000650 EXIT PROGRAM. |
(1) SQLSTATEとSQLMSGを宣言します。
(2) セションを開始します。セションを開始する関数を実行することにより、セションとスレッド(sub_threadB)が対応付けられます。
(3) サーバとコネクションを接続します。
(4) INSERT文を実行して値を挿入します。
(5) トランザクションをCOMMIT文により終了します。
(6) サーバとのコネクションを切断します。
(7) セションを終了します。
(8) サーバとのコネクションに失敗した場合は、セションを終了します。
アプリケーションを作成するには、複数スレッド間の排他などを考慮して、実行したSQL文によるデータベースの検索および更新結果が正しくなるようにしなければなりません。以下に注意点を示します。
1つのセションに対して複数のスレッドが存在する場合、各スレッドが同時に動作しないようにしてください。セマフォを利用するなどして排他制御を考慮し、アプリケーションの作成者が責任をもって対処してください。
セションを破棄する前には、必ずDISCONNECT文を実行してください。
マルチスレッド環境でアプリケーションを実行する場合も、トランザクション単位にSymfoware/RDBで排他制御を行います。また、カーソル操作についても、カーソルをオープンした後に、単一コネクションにおける複数のスレッド間では同じカーソルを操作できますが、複数のコネクションにまたがって同じカーソルを操作することはできません。
目次 索引 |