如何删除orientdb中的死锁

时间:2015-10-22 12:13:24

标签: java spring-boot orientdb

当我使用Java API查询顶点时,我在OrientDb上遇到太多死锁。发生死锁后,整个数据库都没有响应,我必须杀死该守护进程并重新启动。例如,我从死锁中得到的错误是:

com.orientechnologies.common.concur.OTimeoutException: Can not lock record for 2000 ms. seems record is deadlocked by other record
    at com.orientechnologies.orient.core.storage.impl.local.OAbstractPaginatedStorage.acquireReadLock(OAbstractPaginatedStorage.java:1300)
    at com.orientechnologies.orient.core.tx.OTransactionAbstract.lockRecord(OTransactionAbstract.java:120)
    at com.orientechnologies.orient.core.id.ORecordId.lock(ORecordId.java:282)
    at com.orientechnologies.orient.core.storage.impl.local.OAbstractPaginatedStorage.lockRecord(OAbstractPaginatedStorage.java:1776)
    at com.orientechnologies.orient.core.storage.impl.local.OAbstractPaginatedStorage.readRecord(OAbstractPaginatedStorage.java:1416)
    at com.orientechnologies.orient.core.storage.impl.local.OAbstractPaginatedStorage.readRecord(OAbstractPaginatedStorage.java:694)
    at com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx.executeReadRecord(ODatabaseDocumentTx.java:1569)
    at com.orientechnologies.orient.core.tx.OTransactionNoTx.loadRecord(OTransactionNoTx.java:80)
    at com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx.load(ODatabaseDocumentTx.java:1434)
    at com.orientechnologies.orient.server.network.protocol.binary.ONetworkProtocolBinary.readRecord(ONetworkProtocolBinary.java:1456)
    at com.orientechnologies.orient.server.network.protocol.binary.ONetworkProtocolBinary.executeRequest(ONetworkProtocolBinary.java:346)
    at com.orientechnologies.orient.server.network.protocol.binary.OBinaryNetworkProtocolAbstract.execute(OBinaryNetworkProtocolAbstract.java:216)
    at com.orientechnologies.common.thread.OSoftThread.run(OSoftThread.java:65)

以下是我用来查询边并在顶点之间创建关联的块

public User generateFriend(String mobile, String userRID) {
    StringBuilder errorMsg = new StringBuilder();
    Iterable<OrientVertex> vertexes;

    //Retrieve friends of the user
    List<User> friendsList = new ArrayList<User>();
    vertexes = db.queryVertices("select expand( unionAll(inE('E_Friend').out,outE('E_Friend').in) ) from  " + userRID,errorMsg);
    if (!errorMsg.toString().equals("")) {
        throw new DbException("Db exception occured, " + errorMsg);
    }
    for (OrientVertex v : vertexes){
        friendsList.add(vertexToUser(v));
    }
    //Create edges if between the user and other users with mobile number in the list and if the edge is not yet created
    User u = findUserByMobileNo(friendsList,mobile);
    if ( u == null){
            u = findByMobileNo(mobile);
            if (u != null) {
                //create edge
                db.executeQuery("select createEdge('E_Friend','" + userRID + "','" + u.getRid() + "') from " + userRID, new HashMap<String, Object>(), errorMsg);
                if (!errorMsg.toString().equals("")) {
                    throw new DbException("Db exception occured, " + errorMsg);
                }
            }
    }
    return u;
}



public Iterable<OrientVertex> queryVertices(String query, StringBuilder errMsg){
    logger.error("before getGraph, " + errMsg.toString());
    graph = getGraph(errMsg);
    if (!errMsg.toString().equals("")){
        return null;
    }
    logger.error("after getGraph, " + errMsg.toString());
    Iterable<OrientVertex> vertices = null;
    try {
        OSQLSynchQuery<OrientVertex> qr = new OSQLSynchQuery<OrientVertex>(query);
        vertices = graph.command(qr).execute();
        logger.error("after graph command execute, " + errMsg.toString());
    }
    catch (Exception ex){
        errMsg.append(ex.getMessage());
        logger.error("graph command exception, " + errMsg.toString());
    }
    logger.error("before return vertices, " + errMsg.toString());
    return vertices;
}


public List<ODocument> executeQuery(String sql, HashMap<String,Object> params,StringBuilder errMsg) {
    List<ODocument> result = new ArrayList<ODocument>();
    try {
        db = getDatabase(errMsg);
        if (!errMsg.toString().equals("")){
            return null;
        }
        OSQLSynchQuery<ODocument> query = new OSQLSynchQuery<ODocument>(sql);

        if (params.isEmpty()) {
            result = db.command(query).execute();
        } else {
            result = db.command(query).execute(params);
        }

    } catch (Exception e) {
        errMsg.append(e.getMessage());
        //TODO: Add threaded error log saving mechanism
    }
    return result;
}

1 个答案:

答案 0 :(得分:-1)

由于表死锁上的索引缺失,所以请检查所有涉及此操作的表,并找出列中是否存在索引。 请参阅我遇到同样的死锁问题的link