我们如何改进BaseX数据存储上的更新/写入操作?

时间:2015-11-08 20:54:12

标签: performance xquery benchmarking datastore basex

我正在使用BaseX(基于XML的数据存储区)进行性能基准测试。用于测试,
测试平台
I)10,000个用户,10个朋友,10个资源
II)10万用户,10个朋友,10个资源
我遇到了以下问题:
1)加载数据太慢。随着线程数量的增加,速度变慢 2)加点 - 从BaseX读取/重新读取值更快(每秒17k操作)
3)在BaseX中更新数据非常慢。吞吐量为每秒约10次操作。

我是否正确地说,与读取/检索(10k /秒)相比,BaseX对于写入/更新操作(20 /秒)来说“太慢”了?

请建议我提高写入和更新的效率: 我在BaseX数据存储区中有一个函数insertEntity(更新或插入函数),如下所示 -

public int insertEntity(String entitySet, String entityPK,
            HashMap<String, ByteIterator> values, boolean insertImage) {

        String parentTag ="",childTag ="", key="", entryTag="";     
        StringBuffer insertData = new StringBuffer();       
        Set<String> keys = values.keySet();
        Iterator<String> iterator = keys.iterator();
        while(iterator.hasNext()) {
            String entryKey = iterator.next();
            if(!(entryKey.equalsIgnoreCase("pic") || entryKey.equalsIgnoreCase("tpic")))
                insertData.append("element " + entryKey + " {\"" + StringEscapeUtils.escapeXml(values.get(entryKey).toString()) + "\"},");      
        }   

        if(entitySet.equalsIgnoreCase("users")&& insertImage){
            byte[] profileImage = ((ObjectByteIterator)values.get("pic")).toArray();
            String encodedpImage = DatatypeConverter.printBase64Binary(profileImage);
            insertData.append(" element pic {\"" + encodedpImage + "\"},");

            profileImage = ((ObjectByteIterator)values.get("tpic")).toArray();
            encodedpImage = DatatypeConverter.printBase64Binary(profileImage);
            insertData.append(" element tpic {\"" + encodedpImage + "\"},");
        }

        if(entitySet.equalsIgnoreCase("users"))
        {   
                parentTag = "users";
                childTag = "members";
                entryTag = "member";
                key = "mem_id"; 
                insertData.append("element confirmed_friends {}, element pending_friends {}");

        }
        if(entitySet.equalsIgnoreCase("resources"))
        {   
                parentTag = "resources";
                childTag = "resources";
                entryTag = "resource";
                key = "rid";
                insertData.append("element manipulations {}");
        }


        try {
            session.execute(new XQuery(
                    "insert node element " + entryTag
                      + "{ attribute " + key + "{"
                      + entityPK + "}, "
                      + insertData.toString()
                      + "} "
                      + "into doc('" + databaseName + "/" + parentTag +".xml')/" + childTag
                ));

            String q1 = "insert node element " + entryTag
                      + "{ attribute " + key + "{"
                      + entityPK + "}, "
                      + insertData.toString()
                      + "} "
                      + "into doc('" + databaseName + "/" + parentTag +".xml')/" + childTag;
            System.out.println(q1);




        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return 0;
    }

以下功能是acceptFriendship(更新功能)

public int acceptFriend(int inviterID, int inviteeID) {
        // TODO Auto-generated method stub

        String acceptFriendQuery1 = "insert node <confirmed_friend id = '"
                + inviterID + "'>"
                + " </confirmed_friend>"
                + "into doc('"+databaseName+"/users.xml')/members/member[@mem_id = '"+inviteeID+"']/confirmed_friends";

        String acceptFriendQuery2 = "insert node <confirmed_friend id = '"
                + inviteeID + "'>"
                + " </confirmed_friend>"
                + "into doc('"+databaseName+"/users.xml')/members/member[@mem_id = '"+inviterID+"']/confirmed_friends";

        String acceptFriendQuery3 = "delete node doc('"+databaseName+"/users.xml')/members/member[@mem_id = '"
                + inviteeID + "']/pending_friends/pending_friend[@id = '"+ inviterID +"']";

        try {

            session.execute(new XQuery(acceptFriendQuery1));
            session.execute(new XQuery(acceptFriendQuery2));
            session.execute(new XQuery(acceptFriendQuery3));

            System.out.println("Inviter: "+inviterID +" AND Invitee: "+inviteeID);

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return 0;
    }

0 个答案:

没有答案