我使用mysql-native
。該驅動程序支持vibed
的連接池。在dlang新聞組開發者Nick Sabalausky寫道:數據庫連接模式
「如果你使用的是連接池,你不需要擔心關閉連接,整個過程就是連接保持打開狀態,直到你需要使用連接池當你的程序結束時,連接將自行關閉。「
「您可以創建一次池(無論何時何地)。然後,每次要使用數據庫時,都可以通過調用MySqlPool.lockConnection來獲得連接。」
「調用'close'將始終關閉連接,如果你從池中獲得了連接,那麼當你不再使用它時它會自動返回到池中,不需要做任何特別的事情。 「
關於如何完成池的問題?我已閱讀關於單身模式,不能不知道是這種情況。
我寫了下面的代碼:
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%以上的用戶不需要連接池。建議你避免複雜性,直到你需要它。 –