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 ...
随机推荐
- Android(java)学习笔记267:Android线程池形态
1. 线程池简介 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...
- Android开发 SDK NDK下载
2014.7版本 ADT Bundle http://dl.google.com/android/adt/adt-bundle-windows-x86-20140702.ziphttp://dl.go ...
- jq使用手册
jq 使用手册 翻译整理:Young.J 官方网站:http://jquery.com jQuery是一款同prototype一样优秀js开发库类,特别是对css和XPath的支持,使我们写 ...
- 使用Spring Security实现权限管理
使用Spring Security实现权限管理 1.技术目标 了解并创建Security框架所需数据表 为项目添加Spring Security框架 掌握Security框架配置 应用Security ...
- Oracle基础<1>--数据库设计
一:为什么需要使用数据库设计 数据库设计可以使数据库通过健壮的数据库结构 高效并且健康 的进行工作. 二.数据库设计原则 (数据库设计.系统设计.架构设计) 1.熟悉需求 保证之后需求的变更 不会 ...
- ASP.NET入门(1) - 建立和开发ASP.NET 5 项目
原文转载自:http://www.cnblogs.com/zergcom/p/4493358.html 建立项目 首先,目前只有VS 2015支持开发最新的ASP.NET 5 程序,所以我们首先需要下 ...
- first集合及follow集合
前面那片文章生成的语法分析表并不是最优的,因为有些项在遇到错误输入的时候,并不是采取报错,而是执行规约,直到不能再规约的时候才报错.这是不科学的,我们需要在得到错误输入的时候立马报错,为了实现这个功能 ...
- hdu-5681 zxa and wifi(dp)
题目链接: zxa and wifi Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- DNA电荷转移:电阻的计算公式 & Marcus电子转移理论
更新:26 APR 2016 参考文献: [1] Mechanisms for DNA Charge Transport. Chem. Rev. 2010, 110, 3, 1642-1662 [电子 ...
- 学习Slim Framework for PHP v3 ( 二)
昨天说到能够成功将本地的URL通过在index.php 中添加get(pattern,clouser)路由到指定的处理类中,处理后(这里指存入数据库中),然后返回response在浏览器中显示. 昨天 ...