OrientDB。连接泄漏或只是没有关闭连接

时间:2016-07-29 09:11:28

标签: java orientdb

我们在Wildfly 8上运行了一个大型多线程Java EE应用程序。 我们正在使用OrientDB 2.1.19。

我们在连接泄漏方面遇到了一些问题。在某些时候,Orient服务器停止响应,所有使用db的线程都停留在检索新连接上。

配置如下:

OGlobalConfiguration.CLIENT_CONNECT_POOL_WAIT_TIMEOUT.setValue(5000);
OGlobalConfiguration.CLIENT_DB_RELEASE_WAIT_TIMEOUT.setValue(5000);
OGlobalConfiguration.CLIENT_CHANNEL_MAX_POOL.setValue(1000);
OGlobalConfiguration.DB_POOL_MIN.setValue(100);
OGlobalConfiguration.DB_POOL_MAX.setValue(5000);
OGlobalConfiguration.STORAGE_LOCK_TIMEOUT.setValue(5000);
OGlobalConfiguration.DB_POOL_IDLE_TIMEOUT.setValue(5000);
OGlobalConfiguration.DB_POOL_IDLE_CHECK_DELAY.setValue(1000);

OPartitionedDatabasePool我们通过OPartitionedDatabasePoolFactory

获得
poolFactory = new OPartitionedDatabasePoolFactory();
documentPool = poolFactory.get(orientDBPath, username, password);

然后根据我们的需要,我们使用ODatabaseDocumentTx或OObjectDatabaseTx

documentPool.acquire();

获取ODatabaseDocumentTx或OObjectDatabaseTx,我们将传递给所谓的执行器,执行Runnable或Callable。

public void run(ORunnable<DB> oRunnable) {
    // db is the private member of executor containing acquired db.
    try {
        //...
        oRunnable.run(db);          
        //...
    } catch (Exception e) {

    } finally {
        if(!db.isClosed()) {
            db.close();
        }
    }
}

正如您所看到的,我们正在关闭db in finally部分,我们也完全分离了从db收到的所有文档。但在某些情况下,与DB的连接数量不会下降,之后我们会遇到异常

    2016-07-28 23:10:45,957 FINE  [com.orientechnologies.orient.client.remote.ORemoteConnectionManager] (default task-46) Network connection pool is receiving a closed connection to reuse: discard it
2016-07-28 23:10:45,957 FINE  [com.orientechnologies.orient.client.remote.ORemoteConnectionManager] (default task-46) Cannot unlock connection lock: java.lang.IllegalMonitorStateException
 at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:155) [rt.jar:1.7.0_13]
 at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1260) [rt.jar:1.7.0_13]
  at java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:460) [rt.jar:1.7.0_13]
  at com.orientechnologies.common.concur.lock.OAdaptiveLock.unlock(OAdaptiveLock.java:123) [orientdb-core-2.1.19.jar:2.1.19]
  at com.orientechnologies.orient.enterprise.channel.binary.OChannelBinaryAsynchClient.unlock(OChannelBinaryAsynchClient.java:371) [orientdb-enterprise-2.1.19.jar:2.1.19]
  at com.orientechnologies.orient.client.remote.ORemoteConnectionManager.remove(ORemoteConnectionManager.java:128) [orientdb-client-2.1.19.jar:2.1.19]
  at com.orientechnologies.orient.client.remote.ORemoteConnectionManager.release(ORemoteConnectionManager.java:119) [orientdb-client-2.1.19.jar:2.1.19]
  at com.orientechnologies.orient.client.remote.OStorageRemote.endResponse(OStorageRemote.java:1643) [orientdb-client-2.1.19.jar:2.1.19]
  at com.orientechnologies.orient.client.remote.OStorageRemote.command(OStorageRemote.java:1240) [orientdb-client-2.1.19.jar:2.1.19]
  at com.orientechnologies.orient.client.remote.OStorageRemoteThread.command(OStorageRemoteThread.java:453) [orientdb-client-2.1.19.jar:2.1.19]
  at com.orientechnologies.orient.core.sql.query.OSQLQuery.run(OSQLQuery.java:72) [orientdb-core-2.1.19.jar:2.1.19]
  at com.orientechnologies.orient.core.sql.query.OSQLSynchQuery.run(OSQLSynchQuery.java:85) [orientdb-core-2.1.19.jar:2.1.19]
  at com.orientechnologies.orient.core.query.OQueryAbstract.execute(OQueryAbstract.java:33) [orientdb-core-2.1.19.jar:2.1.19]
  at com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx.query(ODatabaseDocumentTx.java:717) [orientdb-core-2.1.19.jar:2.1.19]

以下是上述例外的代码段

ODocument storedSession = orient.onDocuments().call(new ODocCallable<ODocument>() {
                    @Override
                    public ODocument call(ODatabaseDocumentTx db) {
                        try {
                            List<ODocument> list = db.query(new OSQLSynchQuery<ODocument>("select from " + CLAZZ + " where storedSession_sessionID = ?"), sessionId);

                            if (list.isEmpty()){
                                return null;
                            }
                            return documentUnpin(list.get(0));
                        } catch (Exception e) {
                            // PersistentSession may not be in DB on request (for example in workspaces)
                        }
                        return null;
                    }
                });

有关如何通过连接改善情况的任何建议? 感谢。

0 个答案:

没有答案