Error (MongoDB Atlas) : Connections % of configured limit has gone above 80
안녕하세요. 이번에는 MongoDB를 사용하다가 발생한 에러에 대해서 말씀드릴려고 합니다.
사진1) 에러 사진 |
위 에러에서 발생한 이유는 서버쪽에서 MongoDB쪽의 connection을 끊지 않고 유지하기 때문에 발생하는 현상입니다. 특히 Atlas의 무료버전을 사용하고 있다면 connections을 500개까지 허용하고 있습니다.
사진2) limit까지 올라간 connections |
즉 어디선가 접속을 하고 close를 하지 않은 것입니다. 그럼 해당 문제가 되는 코드를 확인해 보겠습니다.
const { MongoClient} = require('mongodb');
const url =
'mongodb+srv://alex:vlfvhdwntsdfghetk@xrstudio.q7lsz.mongodb.net/myFirstDatabase?retryWrites=true&w=majority';
const client = new MongoClient(url); // 접속할려는 MongoDB 서버의 url을 지정한다.
// Database Name
const dbName = 'test';
// 모든 데이터를 얻기 위한 함수
export async function getAllData() {
await client.connect(); // 몽고DB에 접속을 한다.
console.log('Connected successfully to server : getAllData');
const db = await client.db(dbName); // 해당 MongoDB의 DataBase을 지정한다(위 코드는 'test' DB를 선택)
const collection = await db.collection('games'); // collection을 선택한다.(위 코드는 'game' collection 선택)
return new Promise(function (resolve, reject) {
collection.find().toArray((err, doc) => {
if (err) {
reject(err);
} else {
resolve(doc);
}
});
});
}
위 코드에서 'await client.connect();'부분은 있지만 요청을 종료하고나서 close 부분이 없습니다. 이는 MongoDB쪽에서 계속 요청이 올거라고 예상을 하기 때문에 connections을 유지하는 것입니다. 만약 이것이 500회까지 중첩이 되면 MongoDB에서 해당 Application에 대해서 접속을 차단하게 됩니다.
이를 해결하기 위해 반드시 MongoDB작업이 끝나면 Close해 주는 것입니다.
const { MongoClient} = require('mongodb');
const url =
'mongodb+srv://alex:vlfvhdwntsdfghetk@xrstudio.q7lsz.mongodb.net/myFirstDatabase?retryWrites=true&w=majority';
const client = new MongoClient(url); // 접속할려는 MongoDB 서버의 url을 지정한다.
// Database Name
const dbName = 'test';
// 모든 데이터를 얻기 위한 함수
export async function getAllData() {
await client.connect(); // 몽고DB에 접속을 한다.
console.log('Connected successfully to server : getAllData');
const db = await client.db(dbName); // 해당 MongoDB의 DataBase을 지정한다(위 코드는 'test' DB를 선택)
const collection = await db.collection('games'); // collection을 선택한다.(위 코드는 'game' collection 선택)
return new Promise(function (resolve, reject) {
collection.find().toArray((err, doc) => {
if (err) {
reject(err);
} else {
resolve(doc);
}
});
client.close(); // MongoDB작업 완료후 접속 종료
});
}
이렇게 'client.close();'를 추가해 주면 MongoDB작업이 끝난 다음 접속을 종료하게 됩니다. 그러면 connections가 늘어날 일이 없습니다.
댓글
댓글 쓰기