亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于Mybatis框架的批量數(shù)據(jù)插入的性能問題的探討

        2013-12-31 00:00:00魏靜敏劉歡杰
        計算機光盤軟件與應(yīng)用 2013年19期

        摘 要:本文首先提出了一個基于Mybatis框架下針對ORACLE的批量數(shù)據(jù)插入的性能問題,然后針對該問題進行了調(diào)查,給出了問題的解決方法,并針對提出的方法進行了性能測試和比較。本文給開發(fā)者解決基于java的批量數(shù)據(jù)插入的性能問題提供了一個思路。

        關(guān)鍵詞:ORACLE;Mybatis;批量數(shù)據(jù)插入;性能優(yōu)化

        中圖分類號:TP393.09

        1 問題描述

        在進行web項目的開發(fā)中,數(shù)據(jù)庫使用的是ORACLE11G,O/R層使用的是Mybaits3.1。在進行頁面的某個操作時,需要向DB中插入批量的數(shù)據(jù),數(shù)據(jù)大約不足1000條左右,開發(fā)者按照普通的寫法,通過for循環(huán),每次調(diào)用DB的insert操作進行一條數(shù)據(jù)的插入,從log文件分析,全部數(shù)據(jù)的插入大約需要4,5秒鐘,加上其他的處理,畫面刷新大約需要6秒鐘,無法滿足客戶的要求。

        2 調(diào)查過程

        針對該頁面反映慢的問題,分析得出批量數(shù)據(jù)插入的性能提升是問題的關(guān)鍵,因為它大約占用了整個處理的85%的時間,如果能將它的性能進行優(yōu)化,很大程度上能夠解決該問題。首先分析代碼發(fā)現(xiàn),該DB插入處理是通過for循環(huán)每次插入一條數(shù)據(jù)進行的。盡管大家知道Mybatis本身采用的是連接池技術(shù),每次DB操作不需要進行DB的打開和關(guān)閉,這樣節(jié)省了時間,但是進行上千次的sql文操作也需要花費大量的時間,因此考慮能不能執(zhí)行一次插入操作將所有數(shù)據(jù)登錄到DB中,即實現(xiàn)批量插入。通過調(diào)查,方案有以下2個。

        方案一:針對mybatis框架的。對于不同的DB類型,有以下兩種寫法。

        (1)DB類型為Mysql的情況,可以利用SQL:insert into table values ('a1','a2')('b1','b2')('c1','c2')...,Mybatis的map文件中的寫法如下。

        insert into table (id,name) values

        (#{item.id},{item.name})

        (2)如果DB使用的是ORACLE, 1)的寫法不適用,可以利用SQL:

        insert into table select 'a1','a2' from dual union all select 'b1','b2' from dual union all select 'c1','c2' from dual union all...,

        Mybatis的map文件中的寫法如下:

        insert into table (id,name)

        select #{item.id,jdbcType=VARCHAR},

        #{item.name,jdbcType=VARCHAR}} from dual

        但是,在一條命令SQL引擎默認是一次最多插入1000條記錄,最多2100個字段參數(shù),一次處理海量數(shù)據(jù)容易引起以下兩個錯誤:

        The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Too many parameters were provided in this RPC request. The maximum is 2100.和The number of row value expressions in the INSERT statement exceeds the maximum allowed number of 1000 row values.

        所以插入的時候還要處理一下,如果超過這2個指標的話,就需要做多次插入。以上(方案一)的基本原理就是將所有被插入的數(shù)據(jù)生成一個select子句,這樣通過執(zhí)行一次insert語句將該select的數(shù)據(jù)集插入到DB中。

        方案二:不基于任何框架,利用PreparedStatement對象。

        具體寫法如下

        try {

        String url = \"jdbc:oracle:thin:@IP:1521:orcl\"; // orcl為數(shù)據(jù)庫的SID

        String user = \"oracle\";

        String password = \"oracle\";

        StringBuffer sql = new StringBuffer();

        sql.append(\"insert into table(id,name) values (?,?)\");

        Class.forName(\"oracle.jdbc.driver.OracleDriver\");

        Connection con = (Connection) DriverManager.getConnection(url,user,password);

        // 關(guān)閉事務(wù)自動提交

        con.setAutoCommit(1);

        Long startTime = System.currentTimeMillis();

        PreparedStatement pst = (PreparedStatement) con.prepareStatement(sql.toString());

        for (int i = 0; i < list.size(); i++) {

        Item item = (Item)list.get(i);

        pst.setString(1, item .getId());

        pst.setString(2, item .getName());

        // 把一個SQL命令加入命令列表

        pst.addBatch();

        }

        // 執(zhí)行批量更新

        pst.executeBatch();

        // 語句執(zhí)行完畢,提交本事務(wù)

        con.commit();

        } catch (ClassNotFoundException e) {

        e.printStackTrace();

        } catch (SQLException e) {

        e.printStackTrace();

        }finally{

        If(pst!=1){

        Try{pst.close();}catch(SQLException e){}

        }

        If(con!=1){

        Try{conclose();}catch(SQLException e){}

        }

        }

        3 性能測定

        針對原來的方法和以上2種方法,進行了性能試驗,結(jié)果如下表1所示。

        4 結(jié)束語

        本文通過具體實例,描述了基于java對ORACL進行批量數(shù)據(jù)插入操作的性能優(yōu)化的方法。并針對提出的優(yōu)化方法進行了實際的性能測試,給出了各種方法的測試結(jié)果。為開發(fā)者進行java的批量數(shù)據(jù)插入提供了一個好的方法。

        參考文獻:

        [1]邱小彬,周南,虞萍.基于JAVA的批量數(shù)據(jù)導(dǎo)入導(dǎo)出探討[J].農(nóng)業(yè)網(wǎng)絡(luò)信息,2008-10-26.

        [2]徐雯,高建華.基于Spring MVC及MyBatis的Web應(yīng)用框架研究[J].微型電腦應(yīng)用,2012-07-20.

        [3]尹幫治.基于VC#的Excel表格與SQL Server數(shù)據(jù)庫的批量數(shù)據(jù)導(dǎo)入導(dǎo)出技術(shù)研究[J].企業(yè)技術(shù)開發(fā),2008-08-01.

        作者單位:沈陽工學(xué)院,遼寧撫順 113122;東軟集團股份有限公司,沈陽 110179

        少妇愉情理伦片丰满丰满| 热re99久久精品国产66热6| 成人国产一区二区三区精品不卡| 精品亚洲av一区二区| 91九色最新国产在线观看| 在线播放免费人成毛片乱码| 亚洲午夜福利在线观看| 亚洲国产另类久久久精品小说| 亚洲av乱码一区二区三区观影| 国产在线观看视频一区二区三区| 伊人久久大香线蕉av色| 亚洲熟妇无码av另类vr影视| 日本道免费精品一区二区| 国产精品自拍网站在线| 日本三级香港三级人妇99| 天天夜碰日日摸日日澡| 一本久道久久综合久久| 亚洲色图在线视频观看| 亚洲精品中文字幕一二三四| 少妇人妻中文字幕hd| 性一乱一搞一交一伦一性 | 久久精品无码一区二区乱片子| 蜜桃在线一区二区三区| 亚洲熟女一区二区三区250p| 亚洲av无码久久| 少妇邻居内射在线| 亚洲成a人片77777kkkkk| 久久精品国产亚洲av网站 | 妺妺窝人体色www在线直播| 亚洲免费av第一区第二区| av高清在线不卡直播| 毛片亚洲av无码精品国产午夜| 国产精品青草视频免费播放 | 欧美日韩亚洲国产无线码| 久久久大少妇免费高潮特黄| 国产精品免费无遮挡无码永久视频 | 国产自拍偷拍视频免费在线观看 | 蜜臀av一区二区三区免费观看| 曰韩无码二三区中文字幕| 欧美日本免费一区二| 日本a级片一区二区三区|