데이터베이스 연결 패턴
사용하고 있다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
'itsource' 카테고리의 다른 글
대규모 프로젝트의 경우 스프링 데이터 JPA와 휴지 상태와의 차이점은 무엇입니까? (0) | 2022.10.25 |
---|---|
Java에서 TimeStamp를 최신 상태로 변환하는 방법 (0) | 2022.10.25 |
단말기 내에서 mysql을 사용하여 경고 메시지를 표시하지 않지만 비밀번호는 bash 스크립트로 작성됩니다. (0) | 2022.10.25 |
PHP - php 파일 포함 및 쿼리 매개 변수 전송 (0) | 2022.10.25 |
ContextLoaderListener는? (0) | 2022.10.25 |