Delphi中这样实现数据库连接池功能行不行?请高手指点! ( 积分: 100 )

  • 主题发起人 主题发起人 yaxich
  • 开始时间 开始时间
Y

yaxich

Unregistered / Unconfirmed
GUEST, unregistred user!
整个系统用Delphi开发,数据库连接用ADO,连接的数据库可能是Ms SQL Server,也可能是Oracle,所有的数据库连接都在服务层实现,发现如果在服务层所有Rmd公用一个ADOConnection时,如果客户端同时连接的数量比较多的话,会使的获取数据等待时间过长,但又不可能为每个客户端创建一个数据连接,所以想用数据库连接池,没有找到现成的控件,想如下实现,不知是否正确?请高手指导!
在服务层创建一个List,用来管理ADOConnection,如果有新的客户端请求,则查看List中的ADOConnection有没有空闲的,如果有则直接用该空闲ADOConnection,如果没有则在没有超过最大值的情况下创建新的ADOConnection,并连接到数据库供该客户端使用;当客户端请求使用完毕后,就将所应用的ADOConneciton归还到List中去,但并不使该ADOConneciton断开连接。
请高手指点,这样是否可以?
 
整个系统用Delphi开发,数据库连接用ADO,连接的数据库可能是Ms SQL Server,也可能是Oracle,所有的数据库连接都在服务层实现,发现如果在服务层所有Rmd公用一个ADOConnection时,如果客户端同时连接的数量比较多的话,会使的获取数据等待时间过长,但又不可能为每个客户端创建一个数据连接,所以想用数据库连接池,没有找到现成的控件,想如下实现,不知是否正确?请高手指导!
在服务层创建一个List,用来管理ADOConnection,如果有新的客户端请求,则查看List中的ADOConnection有没有空闲的,如果有则直接用该空闲ADOConnection,如果没有则在没有超过最大值的情况下创建新的ADOConnection,并连接到数据库供该客户端使用;当客户端请求使用完毕后,就将所应用的ADOConneciton归还到List中去,但并不使该ADOConneciton断开连接。
请高手指点,这样是否可以?
 
这样可能不行吧,因为读取空闲的ADOCONNECTION就是一件难事,如何分配是由系统自动完成的,所以可能不行吧.....建议使用另外方法!比如三层结构模式,那样服务器运行负担较小,网络数据传输较快一些,另外如果采用三层模式,传输数据时也要注意简单,传输数据能少就少,减轻网络负担.......
 
学习学习
 
为什么不用MTS,保含事务处理还有各种Pooling(Object,DBConnect,Thread等)都是自动帮你解决的.Midas就没这么方便了.
还有delphi中有Midas的连接池例子在C:/Program Files/Borland/Delphi7/Demos/Midas/Pooler中
 
MTS以前没有接触过,参照KillAll2004的建议,先去看看。
 
我对三层里的事务处理很疑惑,
不知道哪为可以提供一些相关的资料呢?
 
有没有高手直到数据库连接池的开发思路?请高手指点详细开发方法!
 
to:yaxich
我觉得你的思路就可以实现,关键是要控制的好。
可以参照:KillAll2004说的:“delphi中有Midas的连接池例子在C:/Program Files/Borland/Delphi7/Demos/Midas/Pooler中 ”中的设计方法。
一点愚见!
 
使用ado的话,连接池是固有的,使用dbexpress,就麻烦点
bde也有解决连接池的方便手段
参见帮助Database resource dispensers
Opening and closing connections to a database can be time-consuming. By using a resource dispenser to pool database connections, your object can reuse existing database connections rather than create new ones. For example, if you have a database lookup and a database update component running in a customer maintenance application, you can install those components together, and then
they can share database connections. In this way, your applicationdo
es not need as many connections and new object instances can access the data more quickly by using a connection that is already open but not in use.
If you are using BDE components to connect to your data, the resource dispenser is the Borland Database Engine (BDE). This resource dispenser is only available when your transactional object is installed with MTS. To enable the resource dispenser, use the BDE administrator to turn on MTS POOLING in the System/Init area of the configuration.
If you are using the ADO database components to connect to your data, the resource dispenser is provided by ADO.
Note
There is no built-in resource pooling if you are using InterbaseExpress components for your database access.
For remote transactional data modules, connections are automatically enlisted on an object's transactions, and the resource dispenser can automatically reclaim and reuse connections.
 
to 楼主:
你得问题我解决不了,我想问个问题,怎么才能实现将ADOConnection共享给所有客户,比如10个吧。
 
to bjyplbx:
我认为只是让所有用户的ADODataSet的Connection设定为同一个ADOConnection便完成了共享,不知是否正确。
 
那么一个ADOconnetion的事务是怎么回事呢,比如按你说的样子共享后,一个客户进入了事务,其他客户是不是也都进入了这个事务呢,如果是那么当其中一个客户对数据修改后提交(commit)了事务,会不会对其他客户产生不好的结果呢?比如把不需要提交的修改提交了。
 
delphi下的例子很管用.自己看看吧.
 
后退
顶部