itsource

데이터베이스 연결 패턴

mycopycode 2022. 10. 25. 21:33
반응형

데이터베이스 연결 패턴

사용하고 있다mysql-native이 드라이버는 보조 드라이버입니다.vibed의 접속 풀.dlang 뉴스 그룹mysql-native개발자인 Nick Sabalausky는 다음과 같이 썼다.

「접속 풀을 사용하고 있는 경우는, 접속을 닫는 것에 대해 걱정할 필요는 없습니다.요점은 연결을 다시 사용해야 할 때까지 연결이 열린 상태로 유지된다는 것입니다.프로그램이 종료되면 연결이 자동으로 닫힙니다."

"풀을 한 번(어디서나 원하는 시간에) 생성할 수 있습니다.그런 다음 데이터베이스를 사용할 때마다 MySqlPool.lockConnection을 호출하여 연결을 얻습니다."

"'닫기'를 호출하면 연결이 항상 닫힙니다.풀에서 접속이 확립되어 있는 경우, 풀장을 사용하지 않게 되면 자동으로 풀로 돌아갑니다.특별한 작업을 할 필요가 없습니다.

수영장 사용 방법에 대한 질문싱글톤 패턴에 대해 읽은 적이 있는데, 이 경우라면 이해할 수 없습니다.

다음 코드를 작성했습니다.

database class:
import std.stdio;
import std.string;
import mysql;
import vibe.d;

import config;
import user;

class Database
{
    Config config;
    MySqlPool mydb;
    Connection connection;

    this(Config config)
    {
        this.config = config;
        mydb = new MySqlPool(config.dbhost, config.dbuser, config.dbpassword, config.dbname, config.dbport);    
    }

    void connect()
    {
        if(connection is null)
        {
            connection = mydb.lockConnection();
        }
        scope(exit) connection.close();
    }

}

사용자 클래스/클래스:

module user;

import mysql;
import vibe.d;

struct User
{
    int id;
    string login;
    string password;
    string usergroup;
}
    void getUserByName(string login)
    {
        User user;
        Prepared prepared = prepare(connection, `SELECT id, login, password, usergroup from users WHERE login=?`); // need to get connection accessible here to make request to DB
        prepared.setArgs(login);
        ResultRange result = prepared.query();
        if (result.empty) 
            logWarn(`user: "%s" do not exists`, login);
        else
        {
                Row row = result.front;
                user.id = row[0].coerce!(int);
                user.login = row[1].coerce!string;
                user.password = row[2].coerce!string;
                user.usergroup = row[3].coerce!string;

        logInfo(`user: "%s" is exists`, login);
        }

    }

접속할 수 있는 적절한 방법을 이해할 수 없는 문제connection사례.모든 새로운 데이터베이스 접속 클래스를 내부에서 만드는 것은 매우 어리석은 생각인 것 같습니다.users구조.하지만 어떻게 하면 더 나은 방법으로 할 수 있을까요?만들기 위해서Connection connection글로벌?맛있나요?아니면 더 정확한 방법이 있을까요?

scope(exit) connection.close();

그 행을 삭제해 주세요.이제 막 수영장에서 받은 연결을 닫는 것입니다.connect함수가 반환됩니다.거기서 하고 있는 것은, 접속을 열어 곧바로 다시 닫는 것뿐입니다.

바꾸다getUserByName접속을 인수(일반적으로 첫 번째 인수)로 사용합니다.일반적으로, 모든 코드가 호출해야 하는 경우getUserByName접속을 오픈하거나 를 통해 풀에서 접속을 얻어야 합니다.lockConnection에 접속을 전달합니다.getUserByName기타 DB 관련 기능을 사용해야 합니다.그럼 코드가 끝나면getUserByName(다른 DB 함수를 호출할 필요가 있는 경우) 접속에 대해 걱정하지 않고 Vibibed Fiber를 종료합니다(Vibed를 사용하고 풀에서 접속을 취득한 경우).close연결(진동 풀에서 연결을 얻지 못한 경우)

이를 위한 한 가지 방법은 필요한 기능에 연결을 전달하는 것입니다.따라서 getUserByName()을 인수로서 재팩터링합니다.

다른 방법은 DAO 패턴을 사용하는 것입니다. DAO 클래스의 컨스트럭터는 연결을 기본 매개 변수 중 하나로 받아들이고 모든 메서드에서 연결을 사용하여 DB 작업을 수행합니다.

언급URL : https://stackoverflow.com/questions/42083976/database-connection-pattern

반응형