数据库连接模式



我使用mysql-native。此驱动程序支持vibed的连接池。在dlang新闻组mysql-native开发者Nick Sabalausky写道:

"如果你正在使用连接池,你不需要担心关闭连接。关键是连接会一直打开,直到你需要再次使用。当你的程序结束时,连接会自行关闭。">

"您可以创建一次池(无论何时何地)。然后,每次您想使用数据库时,都可以通过调用MySqlPool.lockConnection来获得连接。">

"调用‘关闭’总是会关闭连接。如果你从池中获得连接,那么当你不再使用它时,它会自动返回到池中。无需为此做任何特别的事情。">

关于游泳池应该如何进行的问题?我读过关于singleton模式的文章,但不能取消它,是这种情况吗。

我写了下一个代码:

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函数)后,您要么不再担心连接,让vibed光纤完成(如果您使用vibed并从池中获得连接),要么close连接(如果您没有从vibed池中获得连接)。

一种方法是将连接传递给需要它的函数。因此,您可以重构getUserByName(),将连接作为参数。

另一种选择是使用DAO模式。DAO类的构造函数会将连接作为主要参数之一,所有方法都会使用它来执行DB操作。

相关内容

  • 没有找到相关文章

最新更新