データベース応答時間の計測 (ILE RPG V5R4 サブプロシージャー・サービスプログラム版)

ILE RPG の特徴/メリットであるサブプロシージャーを使用する際、一つのプログラム(モジュール)の中で記述してしまうやり方別のモジュールにして一つのプログラムにまとめるやり方の二つを見てきたのですが、今回は後者のやり方をさらに発展させて、ILE RPG のまた別の特徴であるサービスプログラムというオブジェクトを使う方法を見ていきたいと思います。

別のモジュールにして一つのプログラムにまとめるやり方では、結局最後にはユーティリティプログラムの方も最終的に作成されるプログラムの一部になってしまいます。
実行効率という面ではおそらく有利なのですが、サイズや共有化といった面でのデメリットが考えられます。

サービスプログラムとして、ユーティリティプログラムを分離することでそのデメリットにたいして貢献できる、というわけです。

たとえば、前回作成したプログラムのサイズを見てみましょう。

こちらが今回作成するサービスプログラムを使用したバージョンのものです。
サイズが小さいのがわかりますね。


個々のモジュールを作成するところまではまったく一緒です。というか、そのまま作成したモジュールが使用できます。

作成するとしても

CRTRPGMOD MODULE(ILERPG/RSPBYSQLSP) SRCFILE(ILERPG/QRPGLESRC)
CRTSQLRPGI OBJ(ILERPG/RSPBYSQLI2) SRCFILE(ILERPG/QRPGLESRC) COMMIT(*NONE) OBJTYPE(*MODULE)

と、ここまでは一緒なのですが次のコマンドが異なります。

CRTPGM PGM(ILERPG/RSPBYSQL2) MODULE(ILERPG/RSPBYSQLI2 ILERPG/RSPBYSQLSP) ENTMOD(ILERPG/RSPBYSQLI2)

ユーティリティプログラムのモジュールを使用し、CRTSRVPGM コマンドで *SRVPGM オブジェクトを作成します。

CRTSRVPGM SRVPGM(ILERPG/RSPBYSQLSR) MODULE(ILERPG/RSPBYSQLSP) EXPORT(*ALL)

BNDSRVPGM パラメータに上記のサービスプログラムを指定して CRTPGM コマンドを実行します。
MODULE パラメータにメインプログラムのみを指定します。

CRTPGM PGM(ILERPG/RSPBYSQL3) MODULE(ILERPG/RSPBYSQLI2) ENTMOD(ILERPG/RSPBYSQLI2) BNDSRVPGM(ILERPG/RSPBYSQLSR)

ユーティリティプログラムのソースはまったく同じです。

H NOMAIN                                                                                            
 *                                                                                                  
 /COPY ILERPG/QRPGLESRC,RSPBYSQLPR                                                                  
 *                                                                                                  
P CalcResponse    B                   EXPORT                                                        
D CalcResponse    PI            15P 0                                                               
D   start_time                    Z                                                                 
D   end_time                      Z                                                                 
 *                                                                                                  
 /free                                                                                              
                                                                                                    
     return  %DIFF (end_time : start_time : *SECONDS);                                              
                                                                                                    
 /end-free                                                                                          
 *                                                                                                  
P CalcResponse    E                                                                                  

メインプログラムもまったく同じソースです。

D start_time      S               Z                                                                 
D end_time        S               Z                                                                 
D time_taken      S             15P 0                                                               
 *                                                                                                  
 /COPY ILERPG/QRPGLESRC,RSPBYSQLPR                                                                  
 *                                                                                                  
 /free                                                                                              
     start_time = %timestamp();                                                                     
                                                                                                    
     EXEC SQL DELETE FROM veteam02/part_dim  ;                                                      
                                                                                                    
     EXEC SQL INSERT INTO veteam02/part_dim                                                         
                     SELECT * from veteam01/part_dim ;                                              
                                                                                                    
     end_time = %timestamp();                                                                       
     time_taken = CalcResponse(start_time : end_time);                                              
                                                                                                    
     EXEC SQL INSERT INTO R1  (PROC_TIME, TIME_BEGAN, TIME_END)                                     
                    VALUES(:time_taken, :start_time, :end_time);                                    
                                                                                                    
     *InLR = *On;                                                                              
 /end-free                                                                                          
 *                                                                                                  

DSPPGM コマンドで内容を見てみると、確かにモジュールはメインプログラムのものしか存在しません。

こちらが前回作成したスタティックバインドのものです。
二つのモジュールから構成されていることがわかります。

サービスプログラム情報の方に載っています。

逆に前回のものには(当たり前ですが)載っていないことが確認できます。

あと、作成された *PGM オブジェクトに対する DSPPGM コマンドの出力結果をこちらにおいておきました。

[Top Pageに戻る]

Ads by TOK2