DataSnap中连接池的应用
当开发人员开始创建Delphi的DataSnap应用时很常见的数据库连接定义方式是每个数据模块建立一个连接。这样做将产生大量的数据库连接,并产生很多问题。从Delphi XE开始,EMB提供了Session管理,更容易实现控制客户端连到服务器的数据库连接。客户端应用程序不会知道这些,服务器将完成所有的事情。
当我们创建一个DataSnap服务器时,最好的做法就是定义一个服务器容器(或数据模块)如ServerContainer模块,其中包含DataSnap服务器组件和注册所有的服务器应用程序所需的类。在这个容器中,我们将定义一个负责处理服务器的数据库连接的方法。
作为一个例子,我已经实现了服务器容器上的一个的getConnection方法。这个方法负责为连接池分配连接,这将有每一个客户端连接列表寻找,连接池里包含有每个客户端的连接,当然更简化一点我们可以直接在其上放置一个Connection控件,而不是放置在ServerMethods单元中,从而达到共享数据库连接池的目的。
private
{ Private declarations }
ListofConnection : TDictionary;
public
function GetConnection : TSQLConnection;
当服务器收到来自新的客户端的连接到数据库的请求时,getConnection将创建一个新的连接并添加到连接池清单。如果客户已经有了一个连接相关联,getConnection则只返回的一个SqlConnection实例。连接池使用线程ID来控制每个客户端的唯一连接。如果您使用的DataSnap 2010版本,你必须用GetThreadSession方法来实现这个功能。
function TServerContainer1.GetConnection: TSQLConnection;
var
dbconn : TSQLConnection;
begin
if ListofConnection.ContainsKey(TDSSessionManager.GetThreadSession.Id) then
Result := ListofConnection[TDSSessionManager.GetThreadSession.Id]
else
begin
dbconn := TSQLConnection.Create(nil);
dbconn.Params.Clear;
dbconn.LoadParamsOnConnect := true;
dbconn.ConnectionName := 'DS Employee';
ListofConnection.Add(TDSSessionManager.GetThreadSession.Id, dbconn);
Result := dbconn;
end;
end;
连接定义后,我们需要更新所有数据集使用此连接,这样服务器的所有方法包括create 和运行时的SQL查询都将要调用getConnection方法。
If you are using the VCL Data components (TSQLQuery, TSQLStoredProc, etc…) on your Server DataModules, the onCreate event is a good place to associate the DataSets with the connection, using the following code.
如果您在服务器上DataModules使用VCL的数据组件(TSQLQuery,TSQLStoredProc等...),
在OnCreate事件是一个设置关联数据集的连接的好地方,可以使用下面的代码来设置。
procedure TServerContainer1.SetConnection(Conn: TSqlConnection);
var
i: integer;
begin
if Conn = nil then
Conn := GetConnection;
else
Conn := Sender;
for i := 0 to ComponentCount - 1 do
if Components is TSQLQuery then
TSQLQuery(Components).SQLConnection := Conn;
end;
为了避免数据库连接泄漏,我们实现了DSServer的OnDisconnect事件。当客户端断开连接时这段持续将运行。
if GetConnection <> nil then
GetConnection.Close;
当然我们也可以用此方法实现数据集和TDataSetProvider的池化处理。
版权声明:本文为博主原创文章,未经博主允许不得转载。
DataSnap中连接池的应用的更多相关文章
- spring中连接池的配置
在默认通过myeclipse生成的配置里,spring使用的是apache的dbcp连接池 <bean id="dataSource" class="org.apa ...
- proxool连接池 异常
这是第二次整理这个文章: 首先说明proxool连接池有两种配置方式: 第一种:采用jdbc.properties的方式 第二种:采用proxool.xml的配置方 后面在完善这两种配置方式(在上班哦 ...
- mybatis深入之动态查询和连接池介绍
mybatis深入之动态查询和连接池介绍 一.mybatis条件查询 在mybatis前述案例中,我们的查询条件都是确定的.但在实际使用的时候,我们的查询条件有可能是动态变化的.例如,查询参数为一个u ...
- Mybatis 的连接池技术
我们在前面的 WEB 课程中也学习过类似的连接池技术,而在 Mybatis 中也有连接池技术,但是它采用的是自 己的连接池技术.在 Mybatis 的 SqlMapConfig.xml 配置文件中,通 ...
- jdbc事务、连接池概念、c3p0、Driud、JDBC Template、DBUtils
JDBC 事务控制 什么是事务:一个包含多个步骤或者业务操作.如果这个业务或者多个步骤被事务管理,则这多个步骤要么同时成功,要么回滚(多个步骤同时执行失败),这多个步骤是一个整体,不可分割的. 操作: ...
- 帆软报表FineReport中数据连接的JDBC连接池属性问题
连接池原理 在帆软报表FineReport中,连接池主要由三部分组成:连接池的建立.连接池中连接使用的治理.连接池的关闭.下面就着重讨论这三部分及连接池的配置问题. 1. 连接池原理 连接池技术的核心 ...
- C3P0连接池在hibernate和spring中的配置
首先为什么要使用连接池及为什么要选择C3P0连接池,这里就不多说了,目前C3P0连接池还是比较方便.比较稳定的连接池,能与spring.hibernate等开源框架进行整合. 一.hibernate中 ...
- Netbeans 中创建数据连接池和数据源步骤(及解决无法ping通问题)
1.启动glassfish服务器, 在浏览器的地址栏中输入 http://localhost:4848 2.首先建立JDBC Connection Pools: 3.new 一个Connectio P ...
- Spring中常用的连接池配置
首先,我们准备Jdbc属性文件 jdbc.properties,用于保存连接数据库的信息,利于我们在配置文件中的使用 jdbc.driver=com.mysql.jdbc.Driver jdbc.ur ...
随机推荐
- Joynet示例:知乎爬虫(搜索关键字相关回答,并下载其中的---图(mei)片(nv))
先贴爬虫程序下载地址:http://pan.baidu.com/s/1c2lxl1e 下载解压后 可直接运行 其中的 run.bat:或者你手动打开命令行执行:Joynet examples\Spid ...
- 源自梦想 自定义ViewGroup的整理_2
Android项目: 1.准备资源图片.图片放到hdip里和mdip里对想过的影响:对于320*480的模拟器,默认去mdip里去找图片资源,拿过来的图片可以直接用,清晰度不变.要是所要找的图片在hd ...
- Java学习笔记——显示当前日期的三种方式
一.Date类:这是一种过时的表达方式 import java.util.Date; Date date = new Date(); System.out.println((1900+date.get ...
- 将Winform程序快速转换为在浏览器中运行的程序
http://www.codeproject.com/Articles/31429/Embedding-a-NET-WinForms-Application-in-an-Interne 详见以上文章. ...
- Oracle基础(四) 用户管理
一.用户 当创建一个数据实例时,Oracle会创建一些默认的数据库用户,如SYS,SYSTEM和SCOTT等用户.SYS和SYSTEM用户都是ORACLE的系统用户.而Scott用户是Oracle数据 ...
- 【谷歌市场安装】Google Play 闪退问题解决
Google Play 安装后闪退,是因为手机没有内置GMS(Google Mobile Service) 框架. 由于谷歌退出了中国市场,国产手机很多都没有内置GMS, 导致Google Play ...
- Jquery Validate验证是否为图片格式
//验证是否为图片 jQuery.validator.addMethod("checkPic", function (value, element) { var filepath ...
- Oracle数据库作业-2 添加主键 外键
一.在表student中添加主键sno
- Flask Restful Small Demo
参考: http://www.pythondoc.com/flask-restful/first.html 什么是Rest Client-Server:服务器端与客户端分离. Stateless(无状 ...
- 增强for循环用法___ArrayList数组实现使用下标最好,LinkedList使用增强型的(转载)
总结: 1.For-Each循环的缺点:丢掉了索引信息. 当遍历集合或数组时,如果需要访问集合或数组的下标,那么最好使用旧式的方式来实现循环或遍历,而不要使用增强的for循环,因为它丢失了下标信息. ...