Как правильно закрыть сеанс с помощью neo4j-javascript-driver? - PullRequest
0 голосов
/ 27 марта 2019

Прямо сейчас я выполняю 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);
  }
});

Правильно ли я закрываю сессии в обоих случаях?Если нет, как правильно закрыть сеанс для обоих случаев?

Пожалуйста, помогите, это было головной болью в течение нескольких дней = (

1 Ответ

1 голос
/ 27 марта 2019

Для вашего первого случая вы можете сделать что-то проще:

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

И вы можете использовать тот же шаблон для второго случая.

...