MongoDB 데이터베이스 연결 열기
MongoDB를 사용하는 많은 도입 예에서 다음과 같은 코드를 볼 수 있습니다.
var MongoClient = require('mongodb').MongoClient;
MongoClient.connect("mongodb://localhost:port/adatabase", function(err, db)
{
/* Some operation... CRUD, etc. */
db.close();
});
만약 MongoDB가 다른 데이터베이스 시스템과 같다면,open그리고.close통상, 운용에는 시간이 걸리는 비용이 많이 듭니다.
자, 제 질문은 다음과 같습니다.그냥 하면 되는 거야?MongoClient.connect("...일단 반환된 것을 할당합니다.db일부 모듈에 대한 가치: 애플리케이션의 다른 부분에서 호출될 때 모듈의 다양한 함수가 다양한 데이터베이스 관련 작업(문서 모음에 문서 삽입, 문서 업데이트 등)을 수행하도록 합니다(그 결과 이 기능을 재사용).dbvalue)를 사용하여 어플리케이션이 종료된 후에만,close.
바꿔 말하면open그리고.close데이터베이스 관련 작업을 수행할 필요가 있을 때마다 한 번 수행되지 않습니다.그리고 당신은 그것을 계속 재사용합니다.db초기 단계에서 반환된 객체open\connect마지막으로 폐기하는 것만으로,close모든 데이터베이스 관련 작업을 실제로 완료하면 됩니다.
물론 모든 I/O가 비동기이기 때문에close마지막 데이터베이스 작업이 완료되었는지 확인한 다음close이 정도면 될 것 같습니다만, MongoDB가 처음이라 뭔가 부족한 점이 있는지 다시 한 번 확인해 보고 싶었습니다.감사합니다!
네, 그건 정상적이고 전형적인 행동입니다.앱을 시작하고, DB에 연결하고, DB에 대한 작업을 장시간 수행하며, 연결이 예기치 않게 끊겼을 때 다시 연결한 다음 연결을 닫지 않습니다(프로세스가 끊겼을 때 발생하는 자동 닫힘에 의존합니다).
mongodb 버전^3.1.8
약속으로 연결을 초기화합니다.
const MongoClient = require('mongodb').MongoClient
const uri = 'mongodb://...'
const client = new MongoClient(uri)
const connection = client.connect() // initialized connection
그런 다음 데이터베이스에서 작업을 수행할 때마다 연결을 호출합니다.
// if I want to insert into the database...
const connect = connection
connect.then(() => {
const doc = { id: 3 }
const db = client.db('database_name')
const coll = db.collection('collection_name')
coll.insertOne(doc, (err, result) => {
if(err) throw err
})
})
현재 승인된 답변은 작업을 수행하기 위해 동일한 데이터베이스 연결을 열린 상태로 유지할 수 있지만 닫혔을 때 연결을 재시도하는 방법에 대한 자세한 내용은 누락되어 있습니다.다음으로 자동으로 재접속하는2가지 방법을 나타냅니다.TypeScript에 있지만 필요에 따라 일반 Node.js로 쉽게 변환할 수 있습니다.
방법 1: Mongo Client 옵션
MongoDB의 재접속을 가능하게 하는 가장 간단한 방법은 다음 명령어를 정의하는 것입니다.reconnectTries an options when it it it it it it it it 로 때MongoClient. MongoClient재시도(재시도) 방법을 결정합니다.을 「」로 한다.Number.MAX_VALUE기본적으로 작업을 완료할 수 있을 때까지 영원히 재시도할 수 있도록 합니다.재시도되는 에러를 확인하려면 , 드라이버의 소스 코드를 확인해 주세요.
class MongoDB {
private db: Db;
constructor() {
this.connectToMongoDB();
}
async connectToMongoDB() {
const options: MongoClientOptions = {
reconnectInterval: 1000,
reconnectTries: Number.MAX_VALUE
};
try {
const client = new MongoClient('uri-goes-here', options);
await client.connect();
this.db = client.db('dbname');
} catch (err) {
console.error(err, 'MongoDB connection failed.');
}
}
async insert(doc: any) {
if (this.db) {
try {
await this.db.collection('collection').insertOne(doc);
} catch (err) {
console.error(err, 'Something went wrong.');
}
}
}
}
방법 2: Try-catch 재시도
재접속을 보다 세밀하게 지원하려면 while loop을 사용한 트라이캐치를 사용할 수 있습니다.예를 들어, 다시 연결해야 하는 경우 또는 오류 유형에 따라 다른 작업을 수행할 경우 오류를 기록할 수 있습니다.또한 드라이버에 포함된 표준 조건보다 더 많은 조건에 따라 재시도할 수 있습니다.insert방법은 다음과 같이 변경할 수 있습니다.
async insert(doc: any) {
if (this.db) {
let isInserted = false;
while (isInserted === false) {
try {
await this.db.collection('collection').insertOne(doc);
isInserted = true;
} catch (err) {
// Add custom error handling if desired
console.error(err, 'Attempting to retry insert.');
try {
await this.connectToMongoDB();
} catch {
// Do something if this fails as well
}
}
}
}
}
언급URL : https://stackoverflow.com/questions/18650890/keeping-open-a-mongodb-database-connection
'programing' 카테고리의 다른 글
| Wordpress에서 실제로 준비된 문장을 얻으려면 어떻게 해야 합니까? (0) | 2023.03.26 |
|---|---|
| Wordpress에서 임의의 투고 가져오기 (0) | 2023.03.26 |
| 새 탭에서 React-Router 링크 열기 (0) | 2023.03.26 |
| Oracle에서 문자열 연결 연산자는 무엇입니까? (0) | 2023.03.26 |
| 이미지 자산을 퍼블릭에 저장합니까, 아니면 reactJ에 저장합니까? (0) | 2023.03.26 |