一种数据库连接池实现方法和系统的制作方法

文档序号:10489000阅读:301来源:国知局
一种数据库连接池实现方法和系统的制作方法
【专利摘要】本发明公开了一种数据库连接池实现方法和系统,包括:步骤1)使用c++的单例模式对数据库连接池进行初始化封装;其中,数据库连接池初始化时,设定连接池初始化连接数、连接池最大连接数和连接池连接的数据库名称,同时形成数据库封装类、数据库连接池封装类、结果封装类、事务封装类;步骤2)、接收用户对数据库的查询请求,并从查询请求语句中获取需要查询的数据库,取出数据结果,向用户返回查询结果。
【专利说明】
一种数据库连接池实现方法和系统
技术领域
[0001 ]本发明属于计算机领域,涉及一种数据库连接池实现方法和系统。
【背景技术】
[0002] 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中 体现得尤为突出。一个简单的数据库应用,由于对于数据库的访问不是很频繁。这时可以简 单地在需要访问数据库时,就新创建一个连接,用完后就关闭它,这样做也不会带来什么明 显的性能上的开销。但是对于一个复杂的数据库应用,情况就完全不同了。频繁的建立、关 闭连接,会极大的减低系统的性能,因为对于连接的使用成了系统性能的瓶颈。对数据库连 接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库 连接池正是针对这个问题提出来的。
[0003] 连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存 中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的 空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一 个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接 池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、 最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。
[0004] 目前使用较广泛的数据库连接池实现是在内部对象池中维护一定数量的数据库 连接,并对外暴露数据库连接获取和返回方法。外部使用者可通过getConnection方法获取 连接,使用完毕后再通过releaseConnection方法将连接返回,注意此时连接并没有关闭, 而是由连接池管理器回收,并为下一次使用做好准备。能翻阅到的资料中大多介绍的是 java或c#的数据库连接池实现,c/c++的实现多数是针对mysql的连接进行的管理。
[0005] 现有技术中针对pgsql进行数据库连接池的实现较少,就算实现,大多数都是依 照网络上较广泛的数据库连接池返利进行的实现。

【发明内容】

[0006] 本方案摒弃了网络主流的数据库连接池实现方法,适用c++的一些特性来提升了 数据库连接池的易用性。
[0007] 本发明解决以上技术问题所采取的技术方案如下:
[0008] -种数据库连接池实现方法,包括:
[0009] 步骤1)使用C++的单例模式对数据库连接池进行初始化封装;
[0010] 其中,数据库连接池初始化时,设定连接池初始化连接数、连接池最大连接数和连 接池连接的数据库名称,同时形成数据库封装类、数据库连接池封装类、结果封装类、事务 封装类;
[0011] 步骤2)、接收用户对数据库的查询请求,并从查询请求语句中获取需要查询的数 据库,取出数据结果,向用户返回查询结果。
[0012]进一步地,优选的是,步骤1)具体包括:将数据库中的Dbpool类使用单例模式进行 封装,同时对增删改查都进行事务封装,其中,调用的时候不需要考虑事务操作;
[0013] DbConn类封装时,将Pgsql的基础c函数进行类封装;DbResult类封装时,将Pgsql 的查询结果集PGresult进行封装;DbTrans封装时,通过c++的特性使得数据库连接池支持 事务操作。
[0014] 进一步地,优选的是,步骤2)中,所述查询请求语句中包括:申请结果集和调用数 据库连接池的查询函数,且查询函数支持sql语句的拼接。
[0015] 进一步地,优选的是,同一进程仅保留一个连接池。
[0016] 一种数据库连接池实现系统,包括:
[0017] 初始化封装单元,用于使用C++的单例模式对数据库连接池进行初始化封装;其 中,数据库连接池初始化时,设定连接池初始化连接数、连接池最大连接数和连接池连接的 数据库名称,同时形成数据库封装类、数据库连接池封装类、结果封装类、事务封装类;
[0018] 查询单元,用于接收用户对数据库的查询请求,并从查询请求语句中获取需要查 询的数据库,取出数据结果,向用户返回查询结果。
[0019] 进一步地,优选的是,所述初始化封装单元,进一步用于将数据库中的Dbpool类使 用单例模式进行封装,同时对增删改查都进行事务封装,其中,调用的时候不需要考虑事务 操作;
[0020] DbConn类封装时,将pgsql的基础c函数进行了类封装;DbResult类封装时,将 Pgsql的查询结果集PGresult进行封装;DbTrans封装时,通过c++的特性使得数据库连接池 支持事务操作。
[0021] 进一步地,优选的是,所述查询请求语句中包括:申请结果集和调用数据库连接池 的查询函数,且查询函数支持s q 1语句的拼接。
[0022]进一步地,优选的是,同一进程仅保留一个连接池。
[0023]本发明使用C++的单例模式对数据库连接池进行了封装,既保证了连接的唯一性, 又简化了调用的复杂性;使用可变参数的思想,对数据库的增删改查等操作仅需要调用一 个函数即可实现;可自动回收的数据库结果集;连接池支持事务操作,可以适用复杂逻辑的 处理。
[0024] 本发明的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变 得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可通过在所写的说明 书、权利要求书、以及附图中所特别指出的结构来实现和获得。
【附图说明】
[0025] 下面结合附图对本发明进行详细的描述,以使得本发明的上述优点更加明确。其 中,
[0026] 图1是本发明数据库连接池实现方法的流程示意图;
[0027] 图2是本发明实施例中数据库连接封装类的数据结构示意图;
[0028] 图3是本发明实施例中数据库连接池封装类的数据结构示意图;
[0029] 图4是本发明实施例中结果封装类的数据结构示意图;
[0030] 图5是本发明实施例中是事务封装类的数据结构示意图;
[0031]图6是是本发明实施例中查询的数据结构示意图;
[0032]图7是是本发明实施例中查询的数据结构示意图;
[0033] 图8是本发明数据库连接池实现系统的结构示意图。
【具体实施方式】
[0034] 以下将结合附图及实施例来详细说明本发明的实施方式,借此对本发明如何应用 技术手段来解决技术问题,并达成技术效果的实现过程能充分理解并据以实施。需要说明 的是,只要不构成冲突,本发明中的各个实施例以及各实施例中的各个特征可以相互结合, 所形成的技术方案均在本发明的保护范围之内。
[0035] 首先,对本发明涉及的英文缩写和技术名词进行解释。
[0036] pgsql = PostgreSQL是以加州大学伯克利分校计算机系开发的P0STGRES版本4.2为 基础的对象关系型数据库管理系统;
[0037]数据库连接池:数据库连接池负责分配、管理和释放数据库连接,它允许应用程序 重复使用一个现有的数据库连接,而不是再重新建立一个;
[0038] 可变参数:在c/c++函数中,参数个数可变的函数,例如printfO这个函数;
[0039] sql事务:是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么 完全地不执行;
[0040] 析构函数:与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用 完毕),系统自动执行析构函数。
[0041] 实施例一:
[0042] 一种数据库连接池实现方法,包括:
[0043] 步骤1)使用c++的单例模式对数据库连接池进行初始化封装;
[0044] 其中,数据库连接池初始化时,设定连接池初始化连接数、连接池最大连接数和连 接池连接的数据库名称,同时形成数据库封装类、数据库连接池封装类、结果封装类、事务 封装类;
[0045] 步骤2)、接收用户对数据库的查询请求,并从查询请求语句中获取需要查询的数 据库,取出数据结果,向用户返回查询结果。
[0046]进一步地,优选的是,步骤1)具体包括:将数据库中的Dbpool类使用单例模式进行 封装,同时对增删改查都进行事务封装,其中,调用的时候不需要考虑事务操作;
[0047] DbConn类封装时,将Pgsql的基础c函数进行类封装;DbResult类封装时,将Pgsql 的查询结果集PGresult进行封装;DbTrans封装时,通过c++的特性使得数据库连接池支持 事务操作。
[0048] 进一步地,优选的是,步骤2)中,所述查询请求语句中包括:申请结果集和调用数 据库连接池的查询函数,且查询函数支持sql语句的拼接。
[0049] 本发明使用c++的单例模式对数据库连接池进行了封装,既保证了连接的唯一性, 又简化了调用的复杂性;使用可变参数的思想,对数据库的增删改查等操作仅需要调用一 个函数即可实现;可自动回收的数据库结果集;连接池支持事务操作,可以适用复杂逻辑的 处理。
[0050] 实施例二:
[0051] 如图2所示,本发明的连接池的整体运行流程如其所示,其中,本方案关键点在于 调用简单,整个连接池支持事务调用。
[0052] 具体来说,本方案设计的连接池仅需要在程序开始后进行一次初始化,则整个程 序的生命周期内连接池都一直存活,当程序退出时,利用C++的特性自动调用析构函数会自 动释放数据库连接池的资源。
[0053]其中,数据库连接池的初始化方式如下:
[0054] DbPool::GetInstance()->Init(PG_DEFAULT_INIT_SIZE,PG_DEFAULT_MAX_SIZE, PG_DATABASE_NAME);
[0055] PG_DEFAULT_INIT_SIZE为连接池初始连接数;
[0056] PG_DEFAULT_MAX_SIZE为连接池最大连接数;
[0057] PG_DATABASE_NAME为连接池连接的数据库名称;
[0058] 简易数据库连接池模型封装类如下图:
[0059] 如图2所示,数据库连接封装类的数据结构示意图;
[0060] 如图3所示,数据库连接池封装类的数据结构示意图;
[0061 ]如图4所示,结果封装类的数据结构示意图;
[0062] 如图5所示,是事务封装类的数据结构示意图;
[0063] Dbpool类使用单例模式进行的封装,并且对增删改查都进行了事务的封装,调用 的时候不需要考虑事务操作,DbConn类则将pgsql的基础c函数进行了类的封装,DbResult 将pgsql的查询结果集PGresult进行了封装,DbTrans则通过c++的特性使得数据库连接池 支持事务操作。
[0064] 举个简单的例子,我们有一个数据库表test,内容如图7所示,其为test表内容。其 中,此时我们想要查询张三的手机号,则只需要按照如下方式查询即可:
[0065] string tel; DbResu丨Ldb_res;//申请结果集 DbPool::Getinstance()->r:xecQuery(&db_ res, "select tel from test where 腿me='%sm, "张三");//进行查询 ir(db_res,Nexi〇) { tel = db_res.GetSiring("tel"): } _
[0066] 以往的数据库连接池需要申请资源,然后再释放资源,查询的语句需要提前进行 语句拼接,然后才能调用查询函数,本案的数据库连接池简化了这个查询的步骤,仅仅需要 两个语句,申请结果集,调用数据库连接池的查询函数即可,查询函数支持sql语句的拼接, 简单易用。
[0067] 当查出张三手机号码后,我们发现并非是他现在在用的手机号,则我们仅需要调 用一个语句就可以将张三号码进行修改,修改方式如下:
[0068] DbPool::GetInstance()->ExecQuery(^update test set tel ='%s'where name = ' % s '〃,〃13245898754〃,〃张三");
[0069] 此时的数据库数据则改为了如下内容,如图8所示:
[0070] 对于insert和delete语句的操作都可以参照更新操作,此处不做介绍。
[0071]下面再举一个例子,张三在网购,购买了 50元的商品,可是当他已经完成付款后系 统出现了故障,此时如果张三的金额已经更新为50了,我们需要将他的金额再恢复原来的 值,这个时候就需要用到事务操作了。
[0072] 代码如下:
[0073] DbTrans db_trans; db-trans.Execrupdate test set money=%d where name='%s'",50,π,张三"); if (出现故障): db_trans.Rollback();
[0074] }
[0075] 在出现故障的时候,我们仅需要调用一次Rollback函数,则张三的金额又会变为 事务之前的金额,如果没有出现故障,则db_trans生命周期结束后,析构函数会自动将此次 事务提交,则张三的此次交易成功结束。
[0076] 详细如图6和7所示。
[0077] 本提案的关键点是通过c++单例模式进行了数据库连接池的封装,简化了连接池 的调用方法,且保证了同一进程仅保留一个连接池实例;通过可变参数的思维,在调用数据 增删改查的函数时,可以更简单清晰的进行sql语句的拼接,可以更加简单高效的进行接口 调用。
[0078] 本提案的数据库连接池不仅保留了传统数据库连接池的初始化大小,最大限制大 小等优点,更结合了在产品使用过程中的使用习惯和c++良好的代码封装性,是的接口调用 更加简单,逻辑更加清晰,且创新的在数据库连接池中加入了事务支持,较以往传统的使用 申请新的数据库连接资源进行事务操作要更加优越。
[0079] 本提案的保护点一是使用单例模式进行封装,简化了接口调用;二是支持可变参 数的函数调用方式;三是支持事务的数据库连接池设计思路;四是对本案的全部源码进行 专利保护。
[0080] 该方案除了满足基本数据库连接池的功能外,在接口调用上较传统的数据库连接 池更加简单,对于查询最少仅需两行代码,增删改最少仅需一行代码,且使用可变参数的调 用方式,使得sql语句看起来更加清晰易懂,这可以大大节省开发成本和维护成本。
[0081] 传统的数据库连接池不支持事务操作,本案的数据库连接池结合了 c++的特性,可 以完美支持数据库连接池的事务操作,可以广泛应用于系统复杂性高,流程复杂且需要数 据库事务操作的产品中,使数据库操作更加稳定高效。
[0082] 实施例三:
[0083]与以上方法实施例相对应,本发明还提供了一种数据库连接池实现系统,如图8所 示,包括:初始化封装单元,用于使用C++的单例模式对数据库连接池进行初始化封装;其 中,数据库连接池初始化时,设定连接池初始化连接数、连接池最大连接数和连接池连接的 数据库名称,同时形成数据库封装类、数据库连接池封装类、结果封装类、事务封装类;
[0084] 查询单元,用于接收用户对数据库的查询请求,并从查询请求语句中获取需要查 询的数据库,取出数据结果,向用户返回查询结果。
[0085] 进一步地,优选的是,所述初始化封装单元,进一步用于将数据库中的Dbpool类使 用单例模式进行封装,同时对增删改查都进行事务封装,其中,调用的时候不需要考虑事务 操作;
[0086] DbConn类封装时,将pgsql的基础c函数进行了类封装;DbResult类封装时,将 Pgsql的查询结果集PGresult进行封装;DbTrans封装时,通过c++的特性使得数据库连接池 支持事务操作。
[0087] 进一步地,优选的是,所述查询请求语句中包括:申请结果集和调用数据库连接池 的查询函数,且查询函数支持s q 1语句的拼接。
[0088] 进一步地,优选的是,同一进程仅保留一个连接池。
[0089]本发明使用C++的单例模式对数据库连接池进行了封装,既保证了连接的唯一性, 又简化了调用的复杂性;使用可变参数的思想,对数据库的增删改查等操作仅需要调用一 个函数即可实现;可自动回收的数据库结果集;连接池支持事务操作,可以适用复杂逻辑的 处理。
[0090] 需要说明的是,对于上述方法实施例而言,为了简单描述,故将其都表述为一系列 的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为 依据本申请,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知 悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本申请 所必须的。
[0091] 本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序 产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实 施例的形式。
[0092] 最后应说明的是:以上所述仅为本发明的优选实施例而已,并不用于限制本发明, 尽管参照前述实施例对本发明进行了详细的说明,对于本领域的技术人员来说,其依然可 以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。 凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的 保护范围之内。
【主权项】
1. 一种数据库连接池实现方法,其特征在于,包括: 步骤1)使用C++的单例模式对数据库连接池进行初始化封装; 其中,数据库连接池初始化时,设定连接池初始化连接数、连接池最大连接数和连接池 连接的数据库名称,同时形成数据库封装类、数据库连接池封装类、结果封装类、事务封装 类; 步骤2)、接收用户对数据库的查询请求,并从查询请求语句中获取需要查询的数据库, 取出数据结果,向用户返回查询结果。2. 根据权利要求1所述的数据库连接池实现方法,其特征在于,步骤1具体包括:将数据 库中的Dbpool类使用单例模式进行封装,同时对增删改查都进行事务封装,其中,调用的时 候不需要考虑事务操作; DbConn类封装时,将pgsql的基础c函数进行类封装;DbResult类封装时,将pgsql的查 询结果集PGresult进行封装;DbTrans封装时,通过C++的特性使得数据库连接池支持事务 操作。3. 根据权利要求1或2所述的数据库连接池实现方法,其特征在于,步骤2)中,所述查询 请求语句中包括:申请结果集和调用数据库连接池的查询函数,且查询函数支持sql语句的 拼接。4. 根据权利要求1或2所述的数据库连接池实现方法,其特征在于,同一进程仅保留一 个连接池。5. -种数据库连接池实现系统,其特征在于,包括: 初始化封装单元,用于使用C++的单例模式对数据库连接池进行初始化封装;其中,数 据库连接池初始化时,设定连接池初始化连接数、连接池最大连接数和连接池连接的数据 库名称,同时形成数据库封装类、数据库连接池封装类、结果封装类、事务封装类; 查询单元,用于接收用户对数据库的查询请求,并从查询请求语句中获取需要查询的 数据库,取出数据结果,向用户返回查询结果。6. 根据权利要求5所述的数据库连接池实现系统,其特征在于,所述初始化封装单元, 进一步用于将数据库中的Dbpool类使用单例模式进行封装,同时对增删改查都进行事务封 装,其中,调用的时候不需要考虑事务操作; DbConn类封装时,将pgsql的基础c函数进行了类封装;DbResult类封装时,将pgsql的 查询结果集PGresult进行封装;DbTrans封装时,通过C++的特性使得数据库连接池支持事 务操作。7. 根据权利要求5或6所述的数据库连接池实现系统,其特征在于,所述查询请求语句 中包括:申请结果集和调用数据库连接池的查询函数,且查询函数支持sql语句的拼接。8. 根据权利要求5或6所述的数据库连接池实现系统,其特征在于,同一进程仅保留一 个连接池。
【文档编号】G06F17/30GK105843874SQ201610158063
【公开日】2016年8月10日
【申请日】2016年3月18日
【发明人】马涌
【申请人】山东华软金盾软件股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1