当连接数多,使用频繁时,用连接池大大提高效率

unit uDBPool;

interface

uses Classes ,ADODB,ADOInt,Messages,SysUtils,DataDefine,Windows , Forms,

Dialogs;

type

TDBPool = class

private

FList :TList;

FbLoad :Boolean;

FsConnStr :String;

FbResetConnect: Boolean;  //是否准备复位所有的连接

CS_GetConn: TRTLCriticalSection;

FConnStatus: Boolean;// ADOConnection 连接状态

procedure Clear;

procedure Load;

protected

procedure ConRollbackTransComplete(

Connection: TADOConnection; const Error: ADOInt.Error;

var EventStatus: TEventStatus);

procedure ConCommitTransComplete(

Connection: TADOConnection; const Error: ADOInt.Error;

var EventStatus: TEventStatus);

procedure ConBeginTransComplete(

Connection: TADOConnection; TransactionLevel: Integer;

const Error: ADOInt.Error; var EventStatus: TEventStatus);

public

constructor Create(ConnStr :string);

destructor Destroy; override;

procedure Reset;

function GetConnection: PRecConnection;

procedure AddConnetion ;  // GetConnection繁忙遍历多次时,添加新连接

procedure FreeIdleConnetion ; // 销毁闲着的链接

procedure RemoveConnection(ARecConnetion: PRecConnection);

procedure CloseConnection;   //关闭所有连接

property bConnStauts : Boolean read FConnStatus write FConnStatus default True;

end;

var

DataBasePool : TDBPool;

implementation

{ TDBPool }

procedure TDBPool.ConRollbackTransComplete(

Connection: TADOConnection; const Error: ADOInt.Error;

var EventStatus: TEventStatus);

begin

Now_SWcount := Now_SWcount-1;

end;

procedure TDBPool.ConCommitTransComplete(

Connection: TADOConnection; const Error: ADOInt.Error;

var EventStatus: TEventStatus);

begin

Now_SWcount := Now_SWcount-1;

end;

procedure TDBPool.ConBeginTransComplete(

Connection: TADOConnection; TransactionLevel: Integer;

const Error: ADOInt.Error; var EventStatus: TEventStatus);

begin

Now_SWcount := Now_SWcount+1;

end;

constructor TDBPool.Create(ConnStr: string);

begin

inherited Create;

InitializeCriticalSection(CS_GetConn); //初始临界区对象。

FbResetConnect := False;

FList  := TList.Create;

FbLoad := False;

FsConnStr := ConnStr;

Load;

end;

destructor TDBPool.Destroy;

begin

Clear;

FList.Free;

DeleteCriticalSection(CS_GetConn);

inherited;

end;

procedure TDBPool.Clear;

var

i:Integer;

tmpRecConn :PRecConnection;

begin

for i:= 0 to FList.Count-1 do

begin

tmpRecConn := FList.items[i];

tmpRecConn^.ADOConnection.Close;

tmpRecConn^.ADOConnection.Free;

Dispose(tmpRecConn);

FList.Items[i] := nil;

end;

FList.Pack;

FList.Clear;

end;

procedure TDBPool.Load;

var

i :Integer;

tmpRecConn :PRecConnection;

AdoConn :TADOConnection;

begin

if FbLoad then Exit;

Clear;

for i:=1 to iConnCount do

begin

AdoConn := TADOConnection.Create(nil);

AdoConn.ConnectionString:= FsConnStr;

AdoConn.OnRollbackTransComplete := ConRollbackTransComplete;

AdoConn.OnCommitTransComplete   := ConCommitTransComplete;

AdoConn.OnBeginTransComplete    := ConBeginTransComplete;

//    AdoConn.Open;

AdoConn.LoginPrompt := False;

New(tmpRecConn);

tmpRecConn^.ADOConnection := AdoConn;

tmpRecConn^.isBusy := False;

FList.Add(tmpRecConn);

FConnStatus := True;

end;

end;

procedure TDBPool.Reset;

begin

FbLoad := False;

Load;

end;

function TDBPool.GetConnection: PRecConnection;

var

i :Integer;

tmpRecConnection :PRecConnection;

bFind :Boolean ;

begin

Result := nil;

//                   1、加互斥对象,防止多客户端同时访问

//                   2、改为循环获取连接,知道获取到为止

//                   3、加判断ADOConnection 没链接是才打开

EnterCriticalSection(CS_GetConn);

bFind :=False ;

try

try

//iFindFount :=0 ;

while (not bFind) and (not FbResetConnect) do

begin

//        if not FConnStatus then     //当测试断线的时候可能ADOConnection的状态不一定为False

//          Reset;

for i:= 0 to FList.Count-1 do

begin

//PRecConnection(FList.Items[i])^.ADOConnection.Close ;

tmpRecConnection := FList.Items[i];

if not tmpRecConnection^.isBusy then

begin

if not tmpRecConnection^.ADOConnection.Connected then

tmpRecConnection^.ADOConnection.Open;

tmpRecConnection^.isBusy := True;

Result := tmpRecConnection;

bFind :=True ;

Break;

end;

end;

application.ProcessMessages;

Sleep(50) ;

{ Inc(iFindFount) ;

if(iFindFount>=1) then

begin       // 遍历5次还找不到空闲连接,则添加链接

AddConnetion ;

end;  }

end ;

except

on e: Exception do

raise Exception.Create('TDBPOOL.GetConnection-->' + e.Message);

end;

finally

LeaveCriticalSection(CS_GetConn);

end ;

end;

procedure TDBPool.RemoveConnection(ARecConnetion: PRecConnection);

begin

if ARecConnetion^.ADOConnection.InTransaction then

ARecConnetion^.ADOConnection.CommitTrans;

ARecConnetion^.isBusy := False;

end;

procedure TDBPool.AddConnetion;

var

i,uAddCount :Integer ;

tmpRecConn :PRecConnection;

AdoConn : TADOConnection ;

begin

if  FList.Count >= iMaxConnCount  then

Exit ;

if iMaxConnCount - FList.Count > 10 then

begin

uAddCount :=10 ;

end else

begin

uAddCount :=iMaxConnCount - FList.Count ;

end;

for i:=1 to uAddCount do

begin

AdoConn := TADOConnection.Create(nil);

AdoConn.ConnectionString:= FsConnStr;

AdoConn.OnRollbackTransComplete := ConRollbackTransComplete;

AdoConn.OnCommitTransComplete   := ConCommitTransComplete;

AdoConn.OnBeginTransComplete    := ConBeginTransComplete;

//    AdoConn.Open;

AdoConn.LoginPrompt := False;

New(tmpRecConn);

tmpRecConn^.ADOConnection := AdoConn;

tmpRecConn^.isBusy := False;

FList.Add(tmpRecConn);

Dispose(tmpRecConn) ;

end;

end;

procedure TDBPool.FreeIdleConnetion;

var

i,uFreeCount,uMaxFreeCount :Integer ;

tmpRecConn : PRecConnection ;

begin

if FList.Count<=iConnCount then

Exit ;

uMaxFreeCount :=FList.Count- iConnCount ;

uFreeCount :=0 ;

for i:= 0 to FList.Count do

begin

if (uFreeCount>=uMaxFreeCount) then

Break ;

// New(tmpRecConn) ;

tmpRecConn := FList.items[i];

if tmpRecConn^.isBusy =False  then

begin

tmpRecConn^.ADOConnection.Close;

tmpRecConn^.ADOConnection.Free;

uFreeCount :=uFreeCount +1 ;

end;

Dispose(tmpRecConn);

FList.Items[i] := nil;

end;

FList.Pack;

end;

procedure TDBPool.CloseConnection;

begin

FbResetConnect := True;

EnterCriticalSection(CS_GetConn);

try

Reset;

finally

LeaveCriticalSection(CS_GetConn);

FbResetConnect := False;

end;

end;

end.

java samphore 连接池_ADOConnection数据库连接池相关推荐

  1. 连接池,数据库连接池

    连接池 连接池是什么? 连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用. 连接池的优点 减少连接创建时间 简化的编程模式 受控的资源使用 注:连接池能够使性能最大化, ...

  2. spring 数据库 链接db2_Druid,Java语言中最好的数据库连接池

    Druid是Java语言中最好的数据库连接池,这话不是我说的,是Druid官方文档自己这样描述的,这是何等的自信! 连接池的作用,跟线程池的作用大同小异,都是为了减少频繁的创建销毁连接IO,提升性能. ...

  3. c3p0 服务启动获取连接超时_JDBC数据库连接池

    连接池的本质是构建一个容器,容器是用来存创建好的线程,http连接.数据库连接.netty连接等 各个连接池的使用大致分为三个部分 1.首先是初始化连接池,根据设置相应的参数.连接池的大小.核心连接数 ...

  4. java tomcat数据库连接池,tomcat 数据库连接池拿不到连接

    我们是 springboot1.x 的应用 用的自带的数据库连接池就是 tomcat,数据库用的是 oracle,现在发生了一些奇怪的事就是初始化数据库连接池的时候可能会卡在创建连接那一步,但是重启可 ...

  5. java中常用的连接池_java数据库连接池

    编写标准的数据源(规范) Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口.这样应用程序可以方便的切换不同厂商的连接池! 常见的 ...

  6. java jdbc init_Java 的JDBC 数据库连接池实现方法

    虽然 J2EE 程序员一般都有现成的应用服务器所带的JDBC 数据库连接池,不过对于开发一般的 Java Application . Applet 或者 JSP.velocity 时,我们可用的JDB ...

  7. mysql的连接池配置文件,数据库连接池/配置文件数据库连接池

    1.方式 一种是使用直接c3p0数据库连接池,一种是使用配置文件将连接信息写在配置文件中. 将连接信息写在配置文件中有很多好处,比如如果想替换一个线上项目的数据库,只要改变配置文件中的链接信息就可以了 ...

  8. java jdbc close原理_JDBC数据库连接池原理

    JDBC是java数据库连接的简称.它是一种用于实行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用java语言编写的类和接口组成.其相关的API都在java.sql.*包下 ...

  9. Java Web 03 — JDBC_02(数据库连接池_C3P0_Druid、JdbcTemplate)

    文章目录 六:数据库连接池 6.1 概念 6.2 c3p0 6.3 Druid 6.4 DBCP(Apache) 6.5 DBUtils(快速创建对象,并以集合形式返回) 七.Spring JDBC ...

最新文章

  1. SAP S4 OP/Cloud大乱斗
  2. EMMC型号格式查询
  3. 详解Windows消息分类以及WM_COMMAND与WM_NOTIFY的区别,以及模拟发送控件通知消息
  4. [LeetCode] Single Number
  5. java虚拟机堆栈工作原理_java虚拟机工作原理?
  6. Spark Streaming的工作机制
  7. Javascript 面向对象中的构造函数和原型对象
  8. 刨根问底(一):从INode客户端看如何培养兴趣
  9. 001 vagrant安装box
  10. linux虚拟机模板部署模板,创建和部署基于 Linux 的虚拟机模板
  11. JavaScript通过style只能获取内联 状态的样式
  12. gatsbyjs 了解
  13. 北航的计算机与技术专业如何,计算机科学与技术考研北航的这个专业怎么样
  14. java算法大全_java经典算法_算法面试题大全含答案
  15. java参数传入数组_java传入数组参数
  16. PS PR AI AE LR AU LR ID 下载资源,简单安装,多种方式下载
  17. 香蜜经典句子摘抄,哪句勾起了你的回忆
  18. Java程序编写 • 【第4章 程序:随机本周菜品;简易计算器】
  19. Windows下安全权限设置详解
  20. 浦发笔试考计算机知识么,浦发银行考试:笔试到底考什么?

热门文章

  1. 面试中精华,俺自己总结的
  2. Web.config中创建自定义配置节
  3. 四川加油,中国人加油!我们永远不服输!
  4. java 性能测试文档模板_Java中IO字节流基本操作(复制文件)并测试性能
  5. activiti利弊_事件驱动的安全性的利弊
  6. 孙高飞:人工智能测试_高飞学习钓鱼:为什么好的文档很重要
  7. 20个it专业术语_DevSecOps这个术语是否必要?
  8. 领域驱动 开源项目_我如何在开源领域找到工作
  9. Could not initialize class com.jacob.activeX.ActiveXComponent
  10. 第三十一章 考试作弊