Delphi 中 FireDAC 数据库连接(多线程)

news2024/12/28 4:31:38

参见:Delphi 中 FireDAC 数据库连接(总览)

本主题描述了如何在多线程环境下使用FireDAC。

一、概述

如果满足以下条件,FireDAC是线程安全的。

  1. 一个连接对象和所有与之相关的对象(如TFDQuery、TFDTransaction等)在每个时刻都由一个线程使用。

  1. FDManager在线程开始之前被激活,通过设置FDManager.Active为True。

这意味着,在一个线程打开一个查询后,直到它的处理完成,应用程序不能在另一个线程中使用这个查询和连接对象。同样,在一个线程启动一个交易后,直到交易完成,应用程序不能在另一个线程中使用这个交易和连接对象。

这实际上意味着应用程序必须在所有线程中序列化对连接的访问,这并不是一种方便的技术。破坏这些规则可能会导致行为不当、AV错误和其他错误,例如SQL Server的错误 "连接正忙于处理另一条命令的结果"。

标准的简化方法是为每个线程创建和使用一个与数据库工作的专用连接对象。在这种情况下,不需要额外的序列化。例如,下面的代码在线程中执行DB任务。

type
  TDBThread = class(TThread)
  protected
    procedure Execute; override;
  end;

procedure TDBThread.Execute;
var
  oConn: TFDConnection;
  oPrc: TFDQuery;
begin
  FreeOnTerminate := False;
  oConn := TFDConnection.Create(nil);
  oConn.ConnectionDefName := 'Oracle_Pooled'; // see next section
  oPrc := TFDStoredProc.Create(nil);
  oPrc.Connection := oConn;
  try
    oConn.Connected := True;
    oPrc.StoredProcName := 'MY_LONG_RUNNING_PROC';
    oPrc.ExecProc;
  finally
    oPrc.Free;
    oConn.Free;
  end;
end;

// main application code
var
  oThread1, oThread2: TDBThread;
begin
  FDManager.Active := True;
  ...
  oThread1 := TDBThread.Create(False);
  oThread2 := TDBThread.Create(False);
  ...
  oThread1.WaitFor;
  oThread1.Free;
  oThread2.WaitFor;
  oThread2.Free;
end;
注意:对于上述情况,应用程序在后台运行一个单一的SQL查询,使用异步查询执行模式。一个多线程的应用程序可以在TFDManager.BeforeShutdown事件处理程序中关闭在后台线程中打开的连接,以避免可能的死锁。

二、连接池

费时的数据库交互操作之一是建立连接。在一个多线程的应用程序中,每个线程都会启动,建立一个连接,执行某个简短的任务并释放连接,重复的连接建立可能导致整个系统的性能下降。为了避免这种情况,应用程序可以使用连接池。

连接池只能通过设置Pooled=True来为持久化或私有连接定义启用。对于一个持久化的定义。

[Oracle_Pooled]
DriverID=Ora
Database=ORA_920_APP
User_Name=ADDemo
Password=a
Pooled=True

或用于私有定义设置。

var
  oParams: TStrings;
begin
  oParams := TStringList.Create;
  oParams.Add('Database=ORA_920_APP');
  oParams.Add('User_Name=ADDemo');
  oParams.Add('Password=a');
  oParams.Add('Pooled=True');
  FDManager.AddConnectionDef('Oracle_Pooled', 'Ora', oParams);
  .....................
  FDConnection1.ConnectionDefName := 'Oracle_Pooled';
  FDConnection1.Connected := True;

不能在TFDConnection.Params属性中指定额外的参数,因为所有池中的连接必须共享相同的连接参数。

将TFDConnection.Connected设置为True会从池中获取一个物理连接。将TFDConnection.Connected设置为False会将物理连接释放到池中,但保持连接的开放。要关闭和销毁所有池中的物理连接,应用程序可以调用TFDManager.CloseConnectionDef方法。

FDManager.CloseConnectionDef('Oracle_Pooled');

或通过调用关闭FireDAC驱动程序管理器。

FDManager.Close;

可以指定额外的连接定义参数来设置一个池:

Parameter

Parameter

Example

POOL_CleanupTimeout

直到FireDAC删除超过POOL_ExpireTimeout时间未使用的连接的时间(毫秒)。默认值是30000msecs(30秒)。

3600000

POOL_ExpireTimeout

不活动连接从池中删除并销毁的时间(msecs)。默认值是90000msecs(90秒)。

600000

POOL_MaximumItems

池中的最大连接数。当应用程序需要更多的连接时,就会产生一个异常。默认值是50。

100

关于Delphi 连接池的示例程序,请参见:

你可以在以下位置找到TFDConnection/Pooling示例项目。

Start | Programs | Embarcadero RAD Studio Sydney | Samples,然后导航到。

Object Pascal\DataBase\FireDAC\Samples\Comp Layer\TFDConnection\Pooling

Subversion Repository:你可以在GitHub存储库中找到Delphi代码样本。根据你的RAD Studio版本,按名称搜索到样本库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/386292.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS实现动画效果的菜单收起展开图标,html实现动画效果的箭头

效果 实现代码 此处JS代码引入了jquery <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><style>.menu-icon{position: absolute;left: 20%;top: 30%;transition: all .3s;}.menu-icon:before, .menu…

Rollup L2 and L3

1. 引言 前序博客有&#xff1a; Rollup DecentralizationRollup去中心化Rollup交易的固化流程 Layer 1&#xff1a;数据可用层Layer 2&#xff1a;执行层Layer 3&#xff1a;链下系统 所有系统设计中&#xff0c;都包含了某种可信元素&#xff0c;用于保护系统safety和live…

滑动窗口最大值:单调队列

239. 滑动窗口最大值 难度困难2154收藏分享切换为英文接收动态反馈 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例…

人像磨皮美颜sdk是什么?磨皮技术详解

每当讨论起美颜sdk的功能&#xff0c;“磨皮”肯定首当其冲&#xff0c;从一开始&#xff0c;这个功能就受到了很多人的欢迎&#xff0c;尤其是当它与美白、美颜结合在一起的时候&#xff0c;更是发挥出了最大的作用&#xff0c;时至今日它的热度依然不减。使用者可以通过磨皮功…

网络应用之css 显示特性

css 显示特性学习目标能够说出标签隐藏设置1. display 属性的使用display 属性是用来设置元素的类型及隐藏的&#xff0c;常用的属性有&#xff1a;none 元素隐藏且不占位置inline 元素以行内元素显示block 元素以块元素显示2. 示例代码<style>.box{/* 将块元素转化为行内…

2023年Java 高级工程师 1380 道面试题(附答案)分享

Java 面试八股文有必要背吗&#xff1f; 我的回答是&#xff1a;很有必要。你可以讨厌这种模式&#xff0c;但你一定要去背&#xff0c;因为不背你就进不了大厂。现如今&#xff0c;Java 面试的本质就是八股文&#xff0c;把八股文面试题背好&#xff0c;面试才有可能表现好。…

工作日志day02

1.云计算&#xff1f; 相关职位 开源软件和linux起源&#xff1a; 自由软件之父&#xff1a;理查德.斯托曼linux之父&#xff1a;林纳斯.本纳第克特.托瓦兹linux发行版 RHEL&#xff1a;Red Hat Enterprise Linux 红帽linux商业公司CentOS:Community Enterprise Operating Sys…

ClickHouse 与 Amazon S3 结合?一起来探索其中奥秘

目录ClickHouse 简介ClickHouse 与对象存储ClickHouse 与 S3 结合的三种方法示例参考架构小结参考资料ClickHouse 简介ClickHouse 是一种快速的、开源的、用于联机分析&#xff08;OLAP&#xff09;的列式数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;由俄罗斯的Yan…

Matlab进阶绘图第4期—三维堆叠柱状图/三维堆积图

三维堆叠柱状图是堆叠图&#xff08;见Matlab论文插图绘制模板第6期&#xff09;在三维空间的拓展。 三维堆叠柱状图不仅可以直观地展示各部分总数的对比&#xff0c;还能够看出各部分在总数中所占的比例&#xff0c;从而使数据更加形像。 当然&#xff0c;三维堆叠柱状图的缺…

RT-Thread Nano(2) - 线程

参考:RT-Thread API参考手册: 线程管理 线程的分类:动态线程,静态线程 动态线程是系统自动从动态内存堆上分配栈空间的线程句柄(程序运行时再分配空间),静态线程是由用户分配栈空间与线程句柄(可以说是程序编译时已经分配好空间) 1.创建线程 创建一个动态线程 rt_thread_t …

[Pytorch] 前向传播和反向传播示例

目录 简介 神经网络训练基本步骤 1. 计算图 2. 前向传播 Forward 3. 计算损失Loss 【损失函数】 4. 反向传播 Backward 5. 使用学习率更新权重【优化器】 样例代码 样例结果 样例图解 简介 PyTorch是一个基于Torch的Python开源机器学习库&#xff0c;用于自然语言处理…

四、发布确认

1、发布确认原理 生产者将信道设置成 confirm 模式&#xff0c;一旦信道进入 confirm 模式&#xff0c;所有在该信道上面发布的消息都将会被指派一个唯一的 ID(从 1 开始)&#xff0c;一旦消息被投递到所有匹配的队列之后&#xff0c;broker就会发送一个确认给生产者(包含消息…

某小公司面试记录

记录一次面试过程&#xff0c;还有一些笔试题&#xff0c;挺简单的&#xff0c;排序&#xff0c;去重&#xff0c;this指向&#xff0c;深浅拷贝&#xff0c;微任务的执行顺序&#xff0c;变量提升等。 ES6数组新增的方法 Array.from&#xff1a; 将两类对象转为真正的数组&am…

微信又变天!

大家好&#xff0c;我是良许。 不知道大家有没发现&#xff0c;过去两周&#xff0c;微信又双叒改版了&#xff01; 这个改版&#xff0c;喜欢看公众号的小伙伴可能会不习惯&#xff0c;作为公众号的作者更为难受&#xff0c;用一个变天来形容都不为过。 微信又搞啥幺蛾子呢…

软件测试---测试分类

一 : 按测试对象划分 1.1 可靠性测试 可靠性&#xff08;Availability&#xff09;即可用性&#xff0c;是指系统正常运行的能力或者程度&#xff0c;一般用正常向用户提供软件服务的时间占总时间的百分比表示。 1.2 容错性测试 行李箱 , 四个轮子 , 坏了一个 , 说明这个容错…

如何在香港BGP服务器上进行安全性和隐私性配置?

​  香港BGP服务器是在香港运营的&#xff0c;它是基于BGP多线路的网络拓扑所构建的服务器&#xff0c;主要面向于中国内地和海外地域。香港BGP服务器庞大的市场扩张&#xff0c;引来了国内外企业的眼光。然而&#xff0c;如果想要确保香港BGP服务器上的数据安全可靠&#xf…

Tapdata Cloud 基础课:新功能详解之「微信告警」,更及时的告警通知渠道

【前言】作为中国的 “Fivetran/Airbyte”, Tapdata 是一个以低延迟数据移动为核心优势构建的现代数据平台&#xff0c;内置 60 数据连接器&#xff0c;拥有稳定的实时采集和传输能力、秒级响应的数据实时计算能力、稳定易用的数据实时服务能力&#xff0c;以及低代码可视化操作…

MFC界面控件BCGControlBar v33.4 - 支持Win 11 Mica material主题

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。BCGControlBar专业版和BCGSuite for MFC v33.4已正式发布了&#xff0c;该版本包含了对Windows 11 Mica materia…

小Redis:开源一款迷你C++17 KV内存型数据库

A KV high-performance mini-database based on memory and C17 This project is inspired by Redis source code. 部分模仿Redis源码。 https://github.com/ZYunfeii/MiniKV Command line tools Developed command line tool kvctl. value type:string yunfeiubuntu:~/Min…

JavaScript函数之prototype原型和原型链

文章目录1. 原型2. 显式和隐式原型3. 原型链3.1 访问顺序4. instanceof4.1 如何判断1. 原型 函数的prototype属性 每个函数都有一个prototype属性&#xff0c;它默认指向一个Object空对象&#xff08;即&#xff1a;原型对象&#xff09;。原型对象中有一个属性constructor&a…