SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Google App Engine for JavaでMySQLを使ってみる

Google Cloud SQLとBigtableのコード記述と処理スピードを比較・検討してみる

Google App Engine for JavaでMySQLを使ってみる(2)

マスタ参照

 参照では、ローカルのCloud SQLインスタンス以外、Cloud SQLおよびBigtableの両方で初回の時間遅延が顕著でした。

Cloud SQL

リスト6 Cloud SQLでマスタ参照(revIteminfo)
    public String revltemInfo(String item_no){
        // Start Timer
        long start = System.currentTimeMillis();
        // Start Timer
        try{
            String sql = "select * from item_info where item_no = ?";  //(1)
            PreparedStatement ps = con.prepareStatement(sql);
            ps.setString(1, item_no);
            ResultSet rs = ps.executeQuery();                          //(2)
            if(rs.next()) {    
                String item_name = rs.getString("item_name");
                String final_flag = rs.getString("final_flag");
                String vendor_no = rs.getString("vendor_no");
                String vendor_name = rs.getString("vendor_name");      //(3)
                // End Timer
                long stop = System.currentTimeMillis();    
                // End Timer
                long time = stop - start;    
                rv =  "{\"status\": \"" + "参照成功:  " + time + " ms" + "\",\"item_name\": \"" + item_name + "\", \"final_flag\": \"" + final_flag + "\", \"vendor_no\": \"" + vendor_no + "\", \"vendor_name\": \"" + vendor_name + "\"}";
            } else {
                rv =  "{\"status\": \"参照不成功\"}";
            }                
        }catch(SQLException e){
            rv =  "{\"status\": \"接続不成功\"}";
        }catch(Exception e){
            e.printStackTrace();
            rv = "参照失敗\n理由:" + e.toString();
        }finally{
            try{
                con.close();
            }catch(Exception e){}
        }        
        return rv;
    }

 参照処理では(1)のSQL文指定から、(2)のクエリー実行を経て(3)での検索データの取得終了までで測定を行っています。キー検索での参照データはJSONフォーマットでWebクライアントに送信していますが、参照処理自体は通常のJavaからのMySQLアクセスなので問題ないでしょう。

Bigtable

リスト7 Bigtableでマスタ参照(revIteminfo_kv)
    public String revltemInfo_kv(String item_no){
        // Start Timer
        long start = System.currentTimeMillis();
        // Start Timer
        try{
            Entity itemf = ds.get(KeyFactory.createKey("item_info", item_no));  //(1)
            String item_name = itemf.getProperty("item_name").toString();       //(2)
            String final_flag = itemf.getProperty("final_flag").toString(); 
            String vendor_no = itemf.getProperty("vendor_no").toString(); 
            String vendor_name = itemf.getProperty("vendor_name").toString();   //(3)
            // End Timer
            long stop = System.currentTimeMillis();    
            // End Timer
            long time = stop - start;    
            rv = "{\"status\": \"" + "参照成功:  " + time + " ms" + "\", \"item_name\": \"" + item_name + "\", \"final_flag\": \"" + final_flag + "\", \"vendor_no\": \"" + vendor_no + "\", \"vendor_name\": \"" + vendor_name + "\"}";
        }catch(EntityNotFoundException e){
                rv = "Error = " + e;
        }catch(Exception e){
                rv = "Error = " + e;
        }
        return rv;        
    }    

 Bigtableでは(1)のキー検索で対象となるエンティティを取得し、後は(2)以下のgetPropertyによってプロパティ値を取得します。Bigtableの検索ではSQLによる検索のように取得するプロパティ(フィールド)項目を指定することはなく、SQLで「*」を指定した場合のように必ずすべてのプロパティ項目が取得され、その中から必要な項目だけをgetPropertyで変数にセットする形式になります。

 Low-Level APIを使用した場合は(3)でプロパティ値の取得が完了するまでが参照処理で、リスト7でのSQLではこれと対応する形で時間測定を行っています。

参照処理時間の測定結果

表3 参照処理時間の測定結果(単位ミリ秒)
  1 2 3 4 5
Cloud SQL 参照(クラウド) 890 57 56 57 57
Cloud SQL 参照(ローカルCI) 280 275 282 275 273
Cloud SQL 参照(ローカルMI) 181 19 23 22 23
Bigtable1 参照(クラウド) 725 6 6 9 6
表4 参照処理時間平均(単位ミリ秒)
  全平均 1-4平均
Cloud SQL 参照(クラウド) 223.40 56.75
Cloud SQL 参照(ローカルCI) 277.00 275.75
Cloud SQL 参照(ローカルMI) 53.60 21.75
Bigtable1 参照(クラウド) 150.40 6.75

 参照処理では、Cloud SQLおよびBigtableの両方で、初回検索の検索遅延が大きくなっています。これはかなり時間を置いて検索を行った場合で、例えば実際の業務アプリなどである程度頻繁に使用する場合はあまり問題はないかもしれません。Bigtableでは2回目以降はすべて10ミリ秒以内で検索が終了していますが、これは初回検索で同じkindに属するエンティティがメモリ上にキャッシュされ、2回目以降はキャッシュデータからの読み取りになっていると推測されます。

グラフ2 Cloud SQLとBigtableの参照処理時間(Y軸ミリ秒)
グラフ2 Cloud SQLとBigtableの参照処理時間(Y軸ミリ秒)

 グラフ表示にすると、初回検索の突出した所要時間がよりクリアに見て取れます。参照の場合もアクセスパフォーマンスの順番は同じで、最も高速なのがクラウド上のBigtableで、次にローカルMySQLインスタンスのCloud SQL、クラウド上のCloud SQLと続いています。ローカルでのCloud SQLインスタンスを使用した場合はネットワークレイテンシもあり遅くなっています。

次のページ
マスタ更新

この記事は参考になりましたか?

Google App Engine for JavaでMySQLを使ってみる連載記事一覧
この記事の著者

清野 克行(セイノ カツユキ)

慶應義塾大学工学部電子物理専攻卒。日本IBM、日本HPで、製造装置業を中心とした業務系/基幹業務系システムのSE/マーケティングや、分散アプリケーションによる社内業務システム開発などに携わる。現在は、クラウドやAjax関連の/ソフト開発/書籍執筆/セミナー講師/コンサルティング、などを行っている。情...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/6499 2012/04/13 10:30

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー