<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

        明月松間照 清泉石上流


                                            ——— 兵臨城下   貓科動物
    posts - 70, comments - 137, trackbacks - 0, articles - 23
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    java store procedure 的使用(DB2)

    Posted on 2006-12-15 15:30 兵臨城下 閱讀(1282) 評論(1)  編輯  收藏 所屬分類: Java EE
    突然被要求寫一個測試程序,測試java存儲過程和sql的執行效率,以前沒寫過存儲過程,啃了一段時間,記錄如下:
    使用的數據庫為DB2,首先在db2中建立一個procedure:
    CREATE PROCEDURE SQLTEST (IN tables VARCHAR(200),IN num INTEGER)
    SPECIFIC JDBC_SQLTEST
    DYNAMIC RESULT SETS 0
    DETERMINISTIC
    LANGUAGE JAVA
    PARAMETER STYLEJAVA
    NODBINFO
    FENCED
    THREADSAFE
    MODIFIES SQLDATA
    PROGRAM TYPE SUB
    EXTERNAL NAME'SQLTEST.procedureTest'

    其中SQLTEST為java 的calss名,procedureTest為方法名(詳見如下程序):
    import java.util.StringTokenizer;
    import java.sql.Connection;
    import java.sql.Statement;
    import java.sql.DriverManager;

    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.sql.DataSource;

    public class SQLTEST {
    ?
    ?public static void procedureTest(String tables,int num) {
    ??try{
    ???Connection conn = DriverManager.getConnection("jdbc:default:connection");
    ???Statement stmt = conn.createStatement();
    ???StringTokenizer stk = new StringTokenizer(tables,",");
    ???while(stk.hasMoreTokens()) {
    ????String table = stk.nextToken();
    ????String sql = "SELECT * FROM " + table;
    ????for(int i=0;i<num;i++) {
    ?????stmt.executeQuery(sql);
    ?????
    ????}
    ???}
    ???stmt.close();
    ???conn.close();
    ??}catch(Exception e) {
    ???e.printStackTrace();
    ??}
    ?}
    }
    將此class編譯后拷貝到DB2安裝目錄的function目錄下。

    再用servlet來調用它:
    package com.test;
    import java.io.IOException;
    import java.util.StringTokenizer;
    import java.sql.*;
    import javax.sql.DataSource;
    import javax.naming.InitialContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    public class SQLServlet extends HttpServlet {
    ?public void doGet(HttpServletRequest req, HttpServletResponse resp)
    ??throws ServletException, IOException {
    ???doPost(req,resp);
    ?}
    ?public void doPost(HttpServletRequest req, HttpServletResponse resp)
    ??throws ServletException, IOException {
    ???CallableStatement callStmt = null;
    ???Connection conn = null;
    ???Statement stmt = null;
    ???String tables = "shgt_auth,shgt_master,trx_inbox";
    ???long start = 0;
    ???long end = 0;
    ???long lastTime = 0;
    ???int num = 100;
    ???try {
    ????
    ????//存儲過程調用
    ????conn = getConnection("CET","eximtrx","Standard00");
    ????String procName = "SQLTEST";
    ????String sql = "CALL " + procName + "(?,?)";
    ????callStmt = conn.prepareCall(sql);
    ????callStmt.setString(1,tables);
    ????callStmt.setInt(2,num);
    ????start = System.currentTimeMillis();
    ????callStmt.execute();
    ????end = System.currentTimeMillis();
    ????lastTime = end - start;
    ????System.out.println("###########java store procedure Last time : " + lastTime/1000? + "s" + lastTime%1000 + "ms");
    ????
    ????
    ????
    ????//SQL 調用
    ????conn = getConnection("CET","eximtrx","Standard00");
    ????stmt = conn.createStatement();
    ????StringTokenizer strTok = new StringTokenizer(tables,",");
    ????start = System.currentTimeMillis();
    ????while(strTok.hasMoreTokens()) {
    ?????String table = strTok.nextToken();
    ?????String sql2 = "select * from " + table;
    ?????for(int i=0;i<num;i++){
    ??????stmt.executeQuery(sql2);
    ?????}
    ????}
    ????end = System.currentTimeMillis();
    ????lastTime = end - start;
    ????System.out.println("###########SQL Last time : " + lastTime/1000? + "s" + lastTime%1000 + "ms");
    ???} catch (Exception e) {
    ????e.printStackTrace();
    ???}
    ?}
    ?private Connection getConnection(String ds, String user, String pwd)
    ? throws Exception {
    ?? Connection con = null;
    ?? InitialContext ctx = new InitialContext();
    ?? DataSource fDS = (DataSource)ctx.lookup(ds);
    ?? con = fDS.getConnection(user, pwd);
    ?? return con;
    ?}
    }

    運行此servlet就可成功調用存儲過程。
    其中有個注意點,就是大小寫的問題,剛開始時建存儲過程是這樣CREATEPROCEDURE SQLTest(IN tables VARCHAR(200),IN num INTEGER) ,java class也用的是SQLTest,但是在調存儲過程時會抱錯,說找不到SQLTEST.procedureTest方法,原來數據庫在創建存儲過程時,即使你使用SQLTest,但也會被執行為SQLTEST,所以只有都改成大寫。

    但有點意外的是,通過這個測試出來的數據,存儲過程既然比sql跑得慢,不知道為什么,難道程序有問題?請大家看一下



    評論

    # re: java store procedure 的使用(DB2)  回復  更多評論   

    2006-12-21 20:37 by 兵臨城下
    經過測試才知道,并不是procedure比sql慢,而是SELECT * FROM table這樣短的sql語句不能顯示出procedure的性能,如果sql語句加長,procedure的性能就顯示出來了。
    原理上看:普通的sql語句,每個sql都要到DB端進行編譯,而procedure只要傳入參數就可,減少了編譯量,所以在頻繁使用基本相同的sql語句,或sql語句較長時,應該考驗適用procedure
    主站蜘蛛池模板: 亚洲精品mv在线观看| 91精品国产免费| 亚洲色无码专区一区| 亚洲av无码成h人动漫无遮挡| 日本免费一区二区三区最新| av无码久久久久不卡免费网站| 中文字幕乱码免费看电影| 美女啪啪网站又黄又免费| 亚洲精品综合在线影院| 亚洲视频一区在线观看| 亚洲gv猛男gv无码男同短文| 亚洲午夜精品第一区二区8050| 国产精品无码素人福利免费| 97在线观免费视频观看| 日本在线看片免费人成视频1000| 美女巨胸喷奶水视频www免费| 国产亚洲综合精品一区二区三区| 亚洲va成无码人在线观看| 久久精品国产亚洲AV高清热 | 亚洲国产成人久久精品影视| 国产亚洲精品AA片在线观看不加载 | 又粗又硬又大又爽免费视频播放| 最新猫咪www免费人成| 在线天堂免费观看.WWW| 亚洲一区免费视频| 狼群影院在线观看免费观看直播| 亚洲视频在线观看免费| 久久久久国产精品免费看| 亚洲电影免费在线观看| 99在线视频免费| 亚洲黄色免费在线观看| 亚州免费一级毛片| 中字幕视频在线永久在线观看免费| 亚洲黄色免费网站| 免费看国产精品3a黄的视频| 亚洲免费网站观看视频| 日本不卡视频免费| 亚洲AV无码一区二区三区国产| 一区国严二区亚洲三区| 国产成人毛片亚洲精品| 亚洲啪啪AV无码片|