私はmysql-native
を使用しています。このドライバはvibed
の接続プールをサポートしています。データベース接続パターン
"接続プールを使用している場合は、接続を閉じることについて心配する必要はありません。ポイントは、接続を使用する必要があるまで接続が開いたままであるということですプログラムが終了すると、接続は自動的に閉じられます。
"プールは一度(いつでもどこでも)作成できます。その後、データベースを使用するたびに、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
をグローバルにするには?いいですか?それとも正しい方法がありますか?
ユーザーの95%以上が接続プーリングを必要としないことをお勧めします。必要になるまで複雑さを避けることをお勧めします。 –