programing

MongoDB 데이터베이스 연결 열기

fastcode 2023. 3. 26. 11:51
반응형

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

반응형