連載
» 2012年05月17日 00時00分 公開

基幹系システムでCloud SQLは使えるか試してみたGoogle Cloud SQLは基幹系で使えるのか(後編)(3/4 ページ)

[清野克行,有限会社サイバースペース]

サーブレット側の処理

package  com.business;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
@SuppressWarnings("serial")
public class bomSvlt extends HttpServlet{
    @Override
    public void doGet (HttpServletRequest req, HttpServletResponse res) 
    throws ServletException, IOException{
        String rv = "";
        req.setCharacterEncoding("utf-8");
        res.setContentType("text/html; charset=utf-8");
        PrintWriter out;
        out = res.getWriter();        
        String mode = req.getParameter("mode");                //(1)
        bomBean bom = new bomBean();                        //ビーンスインスタンスの生成
        if(mode.equals("getfinal_j")){                            //(2)
rv = bom.getFinal_j();                                //完成品
}else if(mode.equals("getchild_j")){
String p_item = req.getParameter("p_item");
rv = bom.getChild_j(p_item);                            //子部品
}else if(mode.equals("getiteminfo_j")){
String item_no = req.getParameter("item_no");
rv = bom.getItemInfo_j(item_no);                        //部品情報
    }
:
リスト3 サーブレット(bomSvlt.java)

 リスト1のWebクライアントから送られた非同期リクエストはリスト3のサーブレットが受信し、(1)のmodeパラメータの値から(2)以下のif〜else判断で、処理リクエストに対応するBeansメソッドを呼び出しています。

Beansの処理

package  com.business;
import java.sql.*;
import java.util.List;
import com.google.appengine.api.rdbms.AppEngineDriver;
import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.EntityNotFoundException;
import com.google.appengine.api.datastore.FetchOptions;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import com.google.appengine.api.datastore.Query;
 
public class bomBean{        
    StringBuffer respBuf = new StringBuffer("");
    StringBuffer rv1 = new StringBuffer("");
    String rv = "";
    String db       = "business";
    String user     = "user1";
    String pass     = "pass1";
    Connection con  = null;
    DatastoreService ds = null;
    /* ****************************************** *
    *           コンストラクタ
    * ****************************************** */
    public bomBean(){
        try{
            DriverManager.registerDriver(new AppEngineDriver());
            con = DriverManager.getConnection("jdbc:google:rdbms://branecosmology:business/business",user,pass);    
                                                                //(1) Cloud SQL
        } catch (SQLException e) {    
            respBuf.append("jdbc Driver load error<r>");            
        }
        ds = DatastoreServiceFactory.getDatastoreService();            //(2) Bigtable
}    
:
    /* ****************************************** *
    *           完成品検索
    * ****************************************** */
    public String getFinal_j(){                                    //(3)
        try{
            Statement stmt = con.createStatement();
            String sql = "select distinct p_item from item_master where final='y' order by p_item";
                                                                //(4)
            ResultSet rset = stmt.executeQuery(sql);                    //(5)
            rv = "{ \"entries\":[";
            while(rset.next()){                                        //(6)
                String p_item = rset.getString("p_item");
                rv +=  "{\"p_item\": \"" + p_item + "\"},";
            }
            rv = rv.substring(0, rv.length() - 1);
            rv += "]}";
            rset.close();
            stmt.close();
        }catch(SQLException e){
            rv = "接続失敗\n理由:" + e.toString();
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                con.close();
            }catch(Exception e){}
        }
        return rv;                                                //(7)
    }    
    /* ****************************************** *
    *           子部品検索
    * ****************************************** */
    public String getChild_j(String p_item){
        try{
            Statement stmt = con.createStatement();
            String sql = "select * from item_master where p_item='"+p_item+"' order by c_item";
                                                                        //(8)
            ResultSet rset = stmt.executeQuery(sql);                            //(9)
            rv = "{ \"entries\":[";
            while(rset.next()){
                String c_item = rset.getString("c_item");
                String make = rset.getString("make");
                String stock = rset.getString("stock");
                String vendor = rset.getString("vendor");
                rv += "{\"p_item\": \"" + p_item + "\",\"c_item\": \"" + c_item + "\", \"make\": \"" + make + "\", \"stock\": \"" + stock + "\", \"vendor\": \"" + vendor + "\"},";    //(10)
            }
            rv = rv.substring(0, rv.length() - 1);
            rv += "]}";
            rset.close();
            stmt.close();
        }catch(SQLException e){
            rv = "接続失敗\n理由:" + e.toString();
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                con.close();
            }catch(Exception e){}
        }
        return rv;                                                        //(11)
    }
    /* ****************************************** *
    *           部品情報検索
    * ****************************************** */
    public String getItemInfo_j(String item_no){
        try{
            // Start Timer
            long start = System.currentTimeMillis();
            // Start Timer
            Statement stmt = con.createStatement();
            String sql = "select * from item_info where item_no='" + item_no + "';";
            ResultSet rset = stmt.executeQuery(sql);
            if(rset.next()){
                String item_name = rset.getString("item_name");
                String final_flag = rset.getString("final_flag");
                String vendor_no = rset.getString("vendor_no");
                String vendor_name = rset.getString("vendor_name");
                // End Timer
                long stop = System.currentTimeMillis();    
                long time = stop - start;    
                // End Timer
                rv =  "{\"stat\": \"" + time + "\",\"item_name\": \"" + item_name + "\", \"final_flag\": \"" + final_flag + "\", \"vendor_no\": \"" + vendor_no + "\", \"vendor_name\": \"" + vendor_name + "\"}";
            }else{
                rv = "NO<i>部品番号:" + item_no + "は存在しません。";
            }
            rset.close();
            stmt.close();
        }catch(SQLException e){
            rv = "接続失敗\n理由:" + e.toString();
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                con.close();
            }catch(Exception e){}
        }
        return rv;
    }
リスト4 部品展開用Beans(bomBean.java)

コンストラクタ

 ここでは、Cloud SQLにだけアクセスしています。同じプログラムからCloud SQL(MySQL)とBigtableの両方に接続が可能です。コンストラクタでは、どちらのアクセスにも対応できるようにしています。

 (1)では、Cloud SQLで提供される専用ドライバを使用してMySQLデータベースへ接続します。(2)では、Bigtableアクセス用にDatastoreServiceインスタンス(ここではds)を生成しています。以上の準備で、このBeansからは、Cloud SQLのMySQLとBigtableの両方にアクセスできるようになります。

 (2)のDBへの接続では、ユーザー名とパスワードで「user1」「pass1」を指定しています。これは、事前にGoogle APIs Consoleから登録してあるもので、図3のようにuser1にはSELECT、INSERT、UPDATE、DELETEの権限が付与されています。

 Google Cloud SQLでは専用ドライバを使用しているため、コンストラクタ内では独自の処理部分がありますが、DB接続は、通常行われるJavaからのMySQL接続とまったく同じです。従って、JavaからのMySQLアクセス経験のある方には、まったく問題のない処理手順です。

完成品検索

 完成品の検索は(3)のgetFinalメソッドで行われます。検索パターンは(4)のSQL文で指定されています。

 完成品は、部品マスタ(item_master)内で、ファイナルフラグ(final)が「y」に設定されているので、それを検索条件に指定して、親部品(p_item)をDISTINCTで重複値を排除し、ORDER BYで部品番号を降順ソートしています。

 次に、(5)で検索を実行して(6)のwhile文でJSONフォーマットの返信データを作り、(7)でサーブレットに返信しています。

子部品検索

 子部品検索では、(8)で親部品(p_item)をキーにしてSQL文を作成しています。(9)でSQLを実行して、その結果を(10)を主体にJSONフォーマットのデータにして(11)でサーブレットに返しています。

部品情報検索

 部品情報検索ではアクセスするテーブルが違うだけで手順は同じです。(12)でキー検索のSQL文指定後、(13)で実行し、実行結果を(14)でJSONフォーマットに組み立てて(15)でサーブレットに返します。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。