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

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

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

    我的家園

    我的家園

    一直好奇于MongoDB的讀寫速度以及它的特有的NoSQL查詢機制。有幸作了一次Sybase ASA(SQLAnywhere12)和MongoDB寫入數(shù)據(jù)行的速度的比較。

    這對于大規(guī)模Web訪問來說,非常重要。
    比較基準:

    寫入100000行,每行三列,id(整數(shù)), name varchar(32),  col_blob或clob,8K左右長度。比較最終的寫入時間。
    1. ASA12:

    dbinit.exe bench.db
    dbeng12.exe bench.db
    代碼如下:

    package com.sql9;

    import java.sql.*;
    import java.util.Properties;


    public class Bench4SQLAnywhere
    {
        // prepare about 100000 rows of data
        // (id, name, col_clob)
        // e.g. (1, 'wang', 'abcdef12345555555555555555555555555555555555555555555....')
        // the col_blob should be 8K or longer.
        // dsn: benchASA
        
        public static final String DSN = "bench_ASA";
        
        public static final String url = "jdbc:sqlanywhere:UserID=dba;Password=sql;Server=bench;DBN=bench";
        
        public static void testWrite()
        {
            Connection conn = null;
            
            System.out.println("begin time: " + new Timestamp(new java.util.Date().getTime()));
            // System.setProperty("java.library.path",  "v:/target/ASA120/Bin32");
            
            
            try
            {
                Properties props = new Properties();
                props.put("DYNAMIC_PREPARE", true);
                conn = DriverManager.getConnection("jdbc:sqlanywhere:DSN=" + DSN + ";uid=dba;pwd=sql", props);
                // conn = DriverManager.getConnection(url, props);
                
                Statement stmt = conn.createStatement();
                stmt.executeUpdate("create table t(id int primary key, name varchar(32) null, col_blob long varchar null)");
                stmt.close();
                stmt = null;
                
                PreparedStatement pstmt = conn.prepareStatement("insert into t values(?, ?, ?)");
                StringBuilder sb = new StringBuilder(8000);
                for (int i=0; i<800; i++)
                {
                    sb.append("abcde12345");
                }
                
                for (int i=0; i<100000; i++)
                {
                    pstmt.setInt(1, i+1);
                    pstmt.setString(2, "wang " + i);
                    pstmt.setString(3, sb.toString());
                    pstmt.executeUpdate();
                    if ((i+1) % 1000 == 0)
                    {
                        conn.commit();
                    }
                }
                conn.commit();
                
                pstmt.close();
            }
            catch (Exception ex)
            {
                ex.printStackTrace();
            }
            finally
            {
                // if conn not null, just drop the table ????
            }
            
            System.out.println("end time: " + new Timestamp(new java.util.Date().getTime()));
            
            try
            {
                if (conn != null)
                {
                    Statement stmt = conn.createStatement();
                    stmt.executeUpdate("drop table t");
                    stmt.close();
                }
            }
            catch (Exception ex)
            {
                ex.printStackTrace();
            }
            finally
            {
                if (conn != null)
                {
                    try
                    {
                        conn.close();
                    }
                    catch (Exception ex2) {}
                }
            }
            
        }
        
        /**
         * @param args
         */
        public static void main(String[] args)
        {
            // TODO Auto-generated method stub
            testWrite();
        }

        
        
        /**
         * result
         *  begin time: 2012-04-12 17:44:22.292
            end time: 2012-04-12 17:55:16.971
         */
    }

    我們可以看到最終結(jié)果: begin time: 2012-04-12 17:44:22.292
            end time: 2012-04-12 17:55:16.971, 大概花了11分鐘。是夠慢的
    運行時需要指定-Djava.library.path=<asa12>/bin32目錄。

    2. MongoDB:
    啟動:mongod.exe --dbpath E:\xionghe\MongoDB\mongodb\data

    客戶端簡單命令:

    db.testCollection.count()
    代碼如下:

    package com.sql9;

    import java.net.UnknownHostException;
    import java.sql.Timestamp;
    import java.util.HashMap;

    import com.mongodb.Mongo;
    import com.mongodb.DB;
    import com.mongodb.DBCollection;
    import com.mongodb.BasicDBObject;
    import com.mongodb.DBObject;
    import com.mongodb.DBCursor;
    import com.mongodb.MongoException;

     

    public class Bench4MongoDB
    {

        
        public static void testWrite() throws UnknownHostException, MongoException
        {
            Mongo m = new Mongo();
         // or
         // Mongo m = new Mongo( "localhost" );
         // or
         // Mongo m = new Mongo( "localhost" , 27017 );

            System.out.println("begin time: " + new Timestamp(new java.util.Date().getTime()));
            
            DB db = m.getDB( "test" );
            
            StringBuilder sb = new StringBuilder(8000);
            for (int i=0; i<800; i++)
            {
                sb.append("abcde12345");
            }
            
            // on row looks like

            DBCollection col = db.getCollection("testCollection");
            for (int i=0; i<100000; i++)
            {
    //            pstmt.setInt(1, i+1);
    //            pstmt.setString(2, "wang " + i);
    //            pstmt.setString(3, sb.toString());
    //            pstmt.executeUpdate();
    //            if ((i+1) % 1000 == 0)
    //            {
    //                conn.commit();
    //            }
                
                BasicDBObject doc = new BasicDBObject();
                doc.put("id", i);
                doc.put("name", "wang " + i);
                doc.put("col_blob", sb.toString());
                // col.insert(doc);
                col.save(doc);
            }
            System.out.println("end time: " + new Timestamp(new java.util.Date().getTime()));
            
            // finally remove the col1 from the mongoDB.
            // col.remove(new BasicDBObject(new HashMap()));
        }
        
        /**
         * @param args
         */
        public static void main(String[] args)
        {
            // TODO Auto-generated method stub
            try
            {
                testWrite();
            }
            catch (UnknownHostException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            catch (MongoException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
        /**
    begin time: 2012-04-12 18:11:18.99
    end time: 2012-04-12 18:11:44.412
     
         */

    }

    看看所花時間:
    begin time: 2012-04-12 18:11:18.99
    end time: 2012-04-12 18:11:44.412
    只花了: 26秒左右。

    我只能說差距太明顯了。。。。。。。
    再看看生成的文件大小:
    bench.db:  814,900KB, .log: 819328KB.
    mongodb的testdb: test.* (test.0,   ... test.5)共6個文件1,073,479,685B也就1G左右。

    分析:
    ASA之所以慢如此之多,一是它基于關(guān)系表,有一個BLOB/CLOB字段要跨頁存儲,同時它要維護主鍵的索引。MongoDB則沒有維護索引。可能對testCollection創(chuàng)建一個索引,再進行比較更合理一些,但我有理由相信,即算加上索引,MongoDB也比ASA要快很多。

    看來,MongoDB適用于互聯(lián)網(wǎng)所言非虛。
    不過,我再看了下MongoDB的license:

     是一個開放源碼項目,其數(shù)據(jù)庫基于 GNU AGPL (Affero General Public License) version 3.0 的許可。此許可是 GNU GPL 的一個修正版,它彌補了版權(quán)限制不適用于軟件使用而僅適用軟件分發(fā)的漏洞。這對于在云中存儲而不經(jīng)常安裝在客戶端設(shè)備上的軟件當(dāng)然是重要的。使用常規(guī) GPL ,您會感覺到實際上無法進行分發(fā),因此潛在地規(guī)避了許可條款。

    AGPL 只適用于它自己的數(shù)據(jù)庫應(yīng)用程序,不適用于 MongoDB 的其他組成部分。允許開發(fā)人員從各種編程語言連接 MongoDB 的官方驅(qū)動程序在 Apache License Version 2.0 許可下分發(fā)。 MongoDB 文檔的使用基于 Creative Commons 許可。

    這是否意味著,如果我要開發(fā)一款基于Cloud的大型互聯(lián)網(wǎng)應(yīng)用,可以直接使用MongoDB和自己的產(chǎn)品集成,而沒有任何法律風(fēng)險?
    有熟悉此道的朋友,請告訴我。。。


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 久久91亚洲人成电影网站| 香蕉视频在线观看免费国产婷婷 | 亚洲综合精品网站| 亚洲第一区在线观看| 亚洲精品无码专区| 午夜神器成在线人成在线人免费| 亚洲人成在久久综合网站| free哆啪啪免费永久| 亚洲av无码电影网| 国产1024精品视频专区免费| 日本亚洲免费无线码| 国产男女猛烈无遮档免费视频网站 | 欧洲乱码伦视频免费国产| 免费一看一级毛片| 一区二区3区免费视频| 国产成人麻豆亚洲综合无码精品 | 欧洲一级毛片免费| 亚洲中文字幕无码中文字| 日韩人妻无码免费视频一区二区三区| 亚洲乱码国产乱码精华| 五月婷婷亚洲综合| 99久久免费国产精品热| 亚洲午夜久久久影院| 久久这里只精品国产免费10| 亚洲国产模特在线播放| 成人人免费夜夜视频观看| 黄页视频在线观看免费| 色久悠悠婷婷综合在线亚洲| 国产精品99久久免费观看| 亚洲成a人片7777| 日本a级片免费看| 成人一区二区免费视频| 亚洲综合激情六月婷婷在线观看| 一级毛片**免费看试看20分钟| 亚洲精品中文字幕乱码三区 | 日本在线看片免费| 亚洲人成网站色在线观看| 亚洲精品无码av天堂| 亚洲美女免费视频| 最好2018中文免费视频| 666精品国产精品亚洲|