简介
建立一个数据库连接时,大家都知道,它可以是一个耗时的过程。因此,使用连接池的原因主要由于特定过程的延迟。连接池拥有连接捆绑,它永远不会被释放??除非池关闭。在一个连接池的设计,重要的是要引入一个抽象层,这将允许不同类型的连接,甚至不同类型的池。这样做的主要方式将介绍几个模式。所有的模式介绍[1]和总结[1]以下报价。抽象工厂
无需指定它们具体的类相关或依赖对象的家庭提供一个接口。{S0}
使用抽象工厂模式时,系统应独立,其产品是如何建立,组成和代表;系统应配置多个系列产品之一;相关的产品对象的家庭是设计用来在一起,你需要执行此约束,或你想提供一类产品库,和你想揭示只是它们的接口,而不是它们的实现。辛格尔顿
确保一个类只有一个实例,并提供一个访问它的全局来看。{S1}
使用Singleton模式时,必须有一个类的一个实例,它必须从一个众所周知的访问点,或唯一的实例时,应分分级扩展的客户,和客户应能使用一个扩展的实例,而无需修改其代码。工厂方法
定义用于创建对象的接口,但是让子类决定实例化哪一个类。工厂方法使一个类的实例化推迟到子类。{S2}
使用工厂方法模式,当一个类无法预料的类的对象,就必须创造一个类希望它的子类来指定创建或类委托责任几个帮手子类的对象,您要本地化其中帮手子类知识是委托。适配器
一个类的接口转换成客户期望的另一个接口。适配器允许类的工作在一起,不能否则由于不兼容的接口。
使用适配器模式,当您要使用现有的类,接口不匹配,你需要一个,你要创建一个可重用的类无关的或意外类的合作,就是不类一定兼容接口或(对象适配器),你需要使用一些现有的子类,但它是不切实际的,以适应分级每一个分它们的接口。对象适配器可以适应它的父类的接口。池的建设
通过使用这些模式,它可以将它们结合起来,得到一个设计,适合连接池的问题。这种模式被命名为池和一般[2]中描述。 CPool和CResource都是摘要。它们被用来使一个抽象层,这将使它可以重用不同的连接和CPoolFactory点看到,甚至不同的池连接池。具体的水平达到一个级别时。这个级别拥有的每一个抽象的对象的实施。的
CPoolFactory是单身[1],它总是返回一个类型CPool的对象。 CPool将总是返回一个类型CResource的对象。这两个对象的初始化是在混凝土层,因此,它是由抽象层隐藏客户端。这给了我们重用的好处,而不是重新实现,因为它是只需要做出新的CConnectionAdapter实施,当连接到另一个数据库。当做到这一点,这是必要的,以确保该池实例化正确的连接??,但很容易。该接口还决定,它返回一个CResource。这意味着,新的实施必须实现它,以防止违反派生的合同。因此,它是只需要以前的实现是在池中创建的变化,因为这两种方案的使用CResource抽象??没有在客户端改变。在C语言实现
创建池时,它从数据库中提取的初始大小和创建的连接的初始数目。这是所有做CConnectionPool类的构造函数。CConnectionPool::CConnectionPool()
{
m_pool.clear();
m_initSize = 0;
long connstr = 0;
CRegistryFacade *registry = new CRegistryFacade;
registry->getKeyFromRegistry("InitSize", &connstr);
if (0 == connstr)
{
registry->setKeyToRegistry("InitSize", "10");
registry->getKeyFromRegistry("InitSize", &connstr);
}
delete registry;
m_initSize = connstr;
for (int i=0; i<m_initSize; i++)
{
CConnectionAdapter * resource = new CConnectionAdapter;
resource->setInUse(false);
m_pool.push_back(resource);
}
}
CConnectionPool类有一种特殊的方法称为CConnectionPool::findNewConnection(),用于寻找新的可用连接的bool和使用的方法是由CConnectionPool:收购()方法。{C}
连接实现与CConnectionPool公布:收购()和CConnectionPool:释放(CResource * RES)方法。这些方法也通过抽象层访问,可以发现在CPool类。CResource* CConnectionPool::aquire()
{
CResource * resource = NULL;
if (NULL == (resource = findNewConnection())) {
resource = new CConnectionAdapter;
m_pool.push_back(resource);
}
return resource;
}
void CConnectionPool::release(CResource* res)
{
bool found = false;
list<CResource*>::iterator ite;
ite=m_pool.begin();
while(ite!=m_pool.end() && !found) {
CResource* entry = *ite;
if (entry->operator == (*res)) {
CConnectionAdapter *adapter =
dynamic_cast<CConnectionAdapter*>(entry);
adapter->setInUse(false);
found = true;
}
ite++;
}
}
ADO连接封装在CConnectionAdapter类。这个类的主要职责是保持连接,但它拥有一个布尔值,它告诉它是否在使用或不和他人之间的独特标识符,如其他信息。CConnectionAdapter::CConnectionAdapter()
{
CoInitialize(NULL);
char* connstr = NULL;
CRegistryFacade *registry = new CRegistryFacade;
registry->getKeyFromRegistry("ConnectionString", &connstr);
if (NULL == connstr || 0 == strlen(connstr))
{
//Failed to retrieve the connection string
//Write default settings to the registry and use them
registry->setKeyToRegistry
("ConnectionString", "DATABASE=db;DSN=dsn;UID=sa;PWD=sa");
if (NULL != connstr) {
free(connstr);
connstr = NULL;
}
registry->getKeyFromRegistry("ConnectionString", &connstr);
}
delete registry;
m_connection.CreateInstance(__uuidof(Connection));
m_connection->CursorLocation = adUseServer;
m_connection->Open( connstr, L"", L"", adConnectUnspecified);
m_currentlyUsed = true;
CoCreateGuid (&m_id);
}
创建的CConnectionAdapter类的实例时,它从注册表中获取连接字符串(目前未加密!),建立连接和设置的唯一标识符。这个类有一个CConnectionAdapter:getConnection()方法,这给当前连接的指针。使用pool
使用此连接池时,它提供了一个框的使用出来,在那里,如连接字符串和的初始大小设置存储在注册表中。它还提供了创建基于这个库提供的抽象层的另一个连接池的可能性。在这种方式,它有可能使一个连接池,它支持Oracle连接以及如果需要的话。//An instance of the pool factory has to be achieved
CPoolFactory *factory = CPoolFactory::getPoolFactory();
//Get an instance of the pool
CPool *pool = factory->getPool();
//Retrieve a connection from the pool
CResource *res = NULL;
res = pool->aquire();
//Release the connection when it is no more needed
pool->release(res);
请注意该库是基于Microsoft数据访问组件(MDAC)。 CConnectionAdapter类封装在所有MDAC独立实施。参考文献
[1]设计模式:可重复使用的面向对象的软件
埃里希伽马,理查德头盔,拉尔夫约翰逊,Vissides约翰
艾迪生韦斯利,1995年
ISBN:0-201-63361-2的元素[2]面向模式的软件体系结构
第一卷。 3:
资源管理方式的迈克尔基歇尔,耆那教Prashant
WILEY,1995年10月
ISBN:0-470-84525-2历史第一,2007年1月:战后初期