首页 > 解决方案 > 使用 neo4j-javascript-driver 关闭会话的正确方法是什么?

问题描述

现在我正在执行writeTransactions,按照文档的建议关闭 neo4j 驱动程序会话。

session.close()但是,我还没有找到出现错误时如何处理。这可能导致池的所有连接永远不会关闭,并且在应用程序启动几天后我收到很多这样的错误:

(node:1) UnhandledPromiseRejectionWarning:
Unhandled promise rejection (rejection id: 5725): 
Neo4jError: Connection acquisition timed out in 60000 ms.

这是驱动配置:

const driver = neo4j.driver(
  process.env.NEO4J_URI,
  neo4j.auth.basic(process.env.NEO4J_USER, process.env.NEO4J_PASSWORD),
  {
    maxConnectionLifetime: 60 * 60 * 1000, // 1 hour
    maxConnectionPoolSize: 300,
    encrypted: "ENCRYPTION_ON",
    trust: "TRUST_CUSTOM_CA_SIGNED_CERTIFICATES",
    trustedCertificates: [process.env.NEO4J_TRUSTED_CERTS],
    logging: {
      level: 'debug',
      logger: (level, message) => console.log('+++' + level + ' ' + message)
    }
  }
);

这些是我将驱动程序用于事务的两种方式:

1. 使用 async/await 和 catch

const neo4jsession = driver.session();

var result = await neo4jsession.writeTransaction(tx =>
  tx.run("Cypher Query")
).catch(err => {
  try {
    neo4jsession.close();
  } finally {
    reject(err);
  }
});

neo4jsession.close();

// Do something with result if not undefined

2. 使用 then/catch

const neo4jsession = driver.session();

var result = neo4jsession.writeTransaction(tx =>
  tx.run("Cypher Query")
);

result.then(items => {
  neo4jsession.close();
  // do something with items
}).catch(error => {
  try {
    neo4jsession.close();
  } finally {
    reject(error);
  }
});

在这两种情况下我是否正确关闭了会话?如果不是,那么在这两种情况下关闭会话的正确方法是什么?

请帮忙,这几天一直很头疼=(

标签: javascriptneo4jneo4j-driver

解决方案


对于您的第一种情况,您可以做一些更简单的事情:

const neo4jsession = driver.session();
try {
  let result = await neo4jsession.writeTransaction(tx =>   tx.run("Cypher Query") )
} 
catch( err } {
  reject(err);
}
finally {
  neo4jsession.close();
}

对于第二种情况,您可以使用相同的模式。


推荐阅读