关于数据库连接架构的设计难题
Design puzzle about database connectivity architecture
我正在设计一个数据库浏览应用程序,它到目前为止还支持MySQL,但最近我开始实现支持Sqlite,我在设计连接架构实现的方式时遇到了一些丑陋的问题。这只是关于"连接"部分(即:在哪里你得到用户/db/主机,或sqlite的文件名),而不是数据库功能。那已经整理好了。
我有一个基类"连接",它暴露了"正常"方法,如name()
,或纯虚拟方法,如virtual string fullLocation() = 0
,它返回给我一个字符串,可用于识别数据库(如:MySql的database@host
,或Sqlite的/etc/mydb.sqlite
)。
现在,用户当然需要指定他想要连接的数据库,因此在应用程序的GUI中,他只需选择类型,然后填写凭据。我的麻烦开始了。我创建了一个MySqlConnection
和一个SqliteConnection
类,都是从Connection
派生的,但大多数情况下,我最终会得到类似的东西:
Connection* c = 0;
if(gui->engine_name() == "MYSQL")
{
string host = gui->getHost();
string user = gui->getUser();
string password = gui->getPassword();
int port = gui->getPort();
string db = gui->getDatabase();
c = new MySqlConnection(host, user, password, db, port);
}
else
{
string dbFile = gui->getSqliteDbFile();
c = new SqliteConnection(dbFile);
}
string meta = application->use_connection(&c);
和我担心,这将持续整个应用程序,由于这两个数据库引擎的性质如此不同。
你有一些关于如何以优雅的方式解决这个问题的指导吗?
您需要模式工厂,它将以抽象的方式为您创建连接。这是肤浅的回答。这个工厂可以很好地用Builder模式参数化。像这样:
ParamBuilder *b = new ParamBuilder;
if(gui->engine_name() == "MYSQL")
{
b->setHost(gui->getHost())
->setUser(gui->getUser());
->setPassword(gui->getPassword());
...
}
else
{
b->setFile(gui->getSqliteDbFile());
}
Connection *c = globalConnectionFactory->createConnection(b);
更优雅的方法是设计一个工厂类并在该工厂的GenerateConnection()
方法中处理GUI输入:
void ConnectionFactory::GenerateConnection(Connection* c)
{
if(gui->engine_name() == "MYSQL")
{
string host = gui->getHost();
string user = gui->getUser();
string password = gui->getPassword();
int port = gui->getPort();
string db = gui->getDatabase();
c = new MySqlConnection(host, user, password, db, port);
}
else
{
string dbFile = gui->getSqliteDbFile();
c = new SqliteConnection(dbFile);
}
}
如果你不喜欢依赖gui,你可以定义一个名为Parameters的结构体,并根据gui的输入更新它的实例,然后把这个对象交给连接工厂的连接生成方法。
相关文章:
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- 如何在多个线程中创建 QSql数据库连接时防止名称冲突
- 数据库连接并将数据从C ++程序保存到MySQL
- 在 C++ 中获取数据库连接
- Firebase C++ Windows 上的实时数据库连接丢失
- 我不能使用 mysql 数据库连接同时使用插入和选择.C++
- C++ Qt SQL lite 数据库连接问题
- C++ 程序中的数据库连接检查
- 打开与 Qt/C++ 的数据库连接
- 如何修复数据库连接的C 程序运行时间错误(0xc0000005)
- 使用libpq组织PostgreSQL数据库连接参数
- Qt 中的数据库连接池
- Qt-同时处理多个数据库连接
- 使用QT C 为Sevaral表单创建常见的数据库连接
- 将Raspberry Pi 2与外部远程数据库连接
- 是否允许在同一 Sqlite 数据库连接中启动多个事务
- IIS-部署ASP.NET网站和数据库连接
- 没有数据库连接的字符串转义
- Singletone中的数据库连接
- 关于数据库连接架构的设计难题