<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 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    java store procedure 的使用(DB2)

    Posted on 2006-12-15 15:30 兵臨城下 閱讀(1289) 評論(1)  編輯  收藏 所屬分類: Java EE
    突然被要求寫一個測試程序,測試java存儲過程和sql的執(zhí)行效率,以前沒寫過存儲過程,啃了一段時間,記錄如下:
    使用的數(shù)據(jù)庫為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來調(diào)用它:
    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 {
    ????
    ????//存儲過程調(diào)用
    ????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 調(diào)用
    ????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就可成功調(diào)用存儲過程。
    其中有個注意點,就是大小寫的問題,剛開始時建存儲過程是這樣CREATEPROCEDURE SQLTest(IN tables VARCHAR(200),IN num INTEGER) ,java class也用的是SQLTest,但是在調(diào)存儲過程時會抱錯,說找不到SQLTEST.procedureTest方法,原來數(shù)據(jù)庫在創(chuàng)建存儲過程時,即使你使用SQLTest,但也會被執(zhí)行為SQLTEST,所以只有都改成大寫。

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



    評論

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

    2006-12-21 20:37 by 兵臨城下
    經(jīng)過測試才知道,并不是procedure比sql慢,而是SELECT * FROM table這樣短的sql語句不能顯示出procedure的性能,如果sql語句加長,procedure的性能就顯示出來了。
    原理上看:普通的sql語句,每個sql都要到DB端進行編譯,而procedure只要傳入?yún)?shù)就可,減少了編譯量,所以在頻繁使用基本相同的sql語句,或sql語句較長時,應(yīng)該考驗適用procedure
    主站蜘蛛池模板: 97在线免费观看视频| 国产午夜亚洲精品午夜鲁丝片| 99精品免费视品| 色天使亚洲综合一区二区| 亚洲国产成人久久综合碰碰动漫3d| 亚洲六月丁香六月婷婷色伊人| 亚洲综合色区在线观看| 成人黄动漫画免费网站视频 | 久久久国产精品福利免费| 亚洲av无码专区在线观看下载| 亚洲毛片无码专区亚洲乱| 亚洲人成人网站色www| 无人在线观看免费高清| h视频免费高清在线观看| 黄色网页免费观看| 亚洲成av人在线观看网站| 亚洲剧情在线观看| 亚洲精品国产免费| 亚洲天堂一区二区| 亚洲AV无码不卡无码| 国产av无码专区亚洲av果冻传媒| 亚洲&#228;v永久无码精品天堂久久 | 一区二区三区免费视频观看| 国产精品久久久亚洲| 亚洲男人av香蕉爽爽爽爽| 久久青草免费91观看| 亚洲AV日韩AV永久无码色欲| 亚洲一区二区三区在线网站 | 亚洲精品免费视频| 九九精品成人免费国产片| 国内精品一级毛片免费看| 国产午夜精品理论片免费观看| 国产福利免费视频| 精品一区二区三区免费观看 | 日本视频免费在线| 日本卡1卡2卡三卡免费| 久久精品无码精品免费专区| 国产精品免费AV片在线观看| 99热这里只有精品免费播放| 9420免费高清在线视频| 97视频免费在线|