FireDAC 接占线导致另一个 hstmt DataSnap
[FireDAC][Phys][ODBC][Microsoft][ODBC SQL Server Driver]连接占线导致另一个 hstmt
同样的程序,在2台win10 正常,1台win10 报连接占线!
SQL Native Client 安装客户端
原因2:存储过程返回有2个结果集,在获取第2个结果集之前执行其他sql 也会引起连接占线
原因3:存储过程返回的数据,cachUpdate=true,利用缓存巧妙的修改数据,出报表,未保存之前,执行别的sql也会引起连接占线,把返回的存储过程的数据集赋值给到FDmemtable里就好了,在FDmemtable里修改。报表从FDmemtable取数据。
TFDStoredProc
FetchOptions.Mode
fmOnDemand
fmAll
2018.10.9 fixed 方法是
页面的create事件里,所有的FDQuery,FDTable的FetchOptions->Mode = fmAll 就好了。
FDQuery3->FetchOptions->Mode = fmAll;
2018.12.19
还有一个原因是
存储过程调用execProc;但是存储过程有返回值,存储过程里有select a,b 返回结果集。
修改存储过程为没有没有结果集,或者改为 OpenProc的调用方法即可。
建立了DataSnap服务器,数据连接用FireDAC FDConnection1。
什么原因?FDConnection1在应用服务器的TDataModule放着,难度要用TRemoteDataModule?
FDConnection1要在ServerMethods1窗体上,不能在TDataModule上放。ServerMethods1具有多线程多用户实例的功能。不同的连接普通的DataModule自然无此功能。
一个连接触发事件顺序:DSTCPServerTransport1Connect>DSServer1Connect>DSServerClass1Instance-Create>TServerMethods1DSServerModuleCreate
DSServer1Disconnect>DSTCPServerTransport1Disconnect>DSServerClass1Instance-Destroy
从继承关系来看,TServerContainer1就是从DataModule继承而来,所以应用服务器工程再添加DataModule就多余没有意义了。应用服务器exe启动后触发一次TServerContainer1::DataModuleCreate事件,
应用服务器退出的时候触发TServerContainer1::DataModuleDestroy事件一次。就说明他确实和DataModule一样的作用。所有客户端连接都共享着一个TServerContainer1控件。
但是每次客户端连接都会触发:
DSTCPServerTransport1Connect和DSServer1Connect事件;
DSServerClass1控件的TServerContainer1::DSServerClass1CreateInstance和TServerContainer1::DSServerClass1DestroyInstance事件。
ServerMethodsUnit1的TServerMethods1::DSServerModuleCreate和TServerMethods1::DSServerModuleDestroy。
可见ServerMethodsUnit1完全是线程概念,每个用户一个实例,每次连接都创建销毁。
ServerMethods1上的FDConnection1必须独立连接,不能再共享ServerContainer1或另外创建的DataModule上的connection了。
ServerMethods1上的方法可以共用ServerMethods1上的FDConnection1连接没有问题。
用FDConnection1连接Datasnap服务器
FireDAC 连接Datasnap服务端。
DriverID=DS
Protocol=tcp/ip
Server=127.0.0.1
Port=211
User_Name=dsusr
Password=123
http://docwiki.embarcadero.com/RADStudio/Berlin/en/Connect_to_DataSnap_Server_(FireDAC)
http://docwiki.embarcadero.com/CodeExamples/Berlin/en/DataSnap.FireDAC_Sample
http://docwiki.embarcadero.com/CodeExamples/Berlin/en/DataSnap.FireDAC_DBX_Sample
http://www.cnblogs.com/hnxxcxg/p/5663372.html
DSConnectEventObject->ChannelInfo->Id
DSConnectEventObject->ChannelInfo->Id
Event.Channel->ChannelInfo->Id
这几个ID是同一个值。
DSConnectEventObject->ConnectProperties[TDBXPropertyNames::UserName]
delphi可以去到UserName,c++builder如何去到这个宏定义UserName?Data::Dbxcommon::TDBXPropertyNames::UserName也不行。这样可以了。
DSConnectEventObject->ConnectProperties->operator[](TDBXPropertyNames_UserName);
which is called after TDSAuthenticationManager.OnUserAuthenticate
). 需要有认证功能才可以。
继承关系图
DSTCPServerTransport1Connect事件中Event.Connection可以获取客户端信息
void __fastcall TServerContainer1::DSTCPServerTransport1Connect(TDSTCPConnectEventObject &Event)
{
Event.Channel->ChannelInfo->Id
Event.Channel->ChannelInfo->ClientInfo.IpAddress
Event.Channel->ChannelInfo->ClientInfo.ClientPort TIdTCPConnection*con;
con=(TIdTCPConnection*)Event.Connection;
con->Socket->Binding->PeerIP;
con->Socket->Binding->PeerPort;
con->Socket->Binding->IP;
con->Socket->Binding->Port;
}
TServerMethods1-->TDSServerModule-->TDSServerModuleBase-->TProviderDataModule-->TDataModule-->TComponent-->TPersistent-->TObject
TServerContainer1-->TDataModule-->TComponent-->TPersistent-->TObject
TRemoteDataModule-->TProviderDataModule-->TDataModule-->TComponent-->TPersistent-->TObject
TDSServerClass-->TDSCustomServerClass-->TDSServerComponent-->TComponent-->TPersistent-->TObject
TDSServer-->TDSCustomServer-->TComponent-->TPersistent-->TObject
TDSTCPServerTransport-->TDSServerTransport-->TDSServerComponent-->TComponent-->TPersistent-->TObject
TDSHTTPService-->TCustomDSHTTPServerTransport-->TCustomDSRESTServerTransport-->TDSServerTransport-->TDSServerComponent-->TComponent-->TPersistent-->TObject
DataSnap,如果客户端异常掉线或拔掉网线,那么在服务端会留下一个TCP连接,这个连接会变成死连接(经过测试,如 果windows的TCP保持连接禁用的话,三个小时该死连接还不消失)。如果大量客户端并发,出现的死TCP连接过多,服务器内存和端口将会增加,直到 占满服务器的端口和耗尽内存为止。如果这样的话,服务器无法健壮稳定的运行。
大家可以另开线程来监控客户端连接,但是今天要给大家讲解的不是这个方法,而是使用TCP协议自带的心跳包功能解决这个问题。
大家先了解一下 TCP keep-alive原理
一个TCP keep-alive 包是一个简单的ACK,该ACK包内容为一个比当前连接sequence number 小于一的包。主机接受到这些ACKs会返
回一个包含当前sequence number 的ACK包。
Keep-alives一般被用来验证远端连接是否有效。如果该连接上没有其
他数据被传输,或者更高level 的 keep-alives被传送,keep-alives 在每个KeepAliveTime被发送。(默认是
7,200,000 milliseconds ,也就是2个小时)。
如果没有收到 keep-alive 应答,keep-alive 将在每 KeepAliveInterval
秒重发一次。KeepAliveInterval 默认为1秒。如 Microsoft 网络功能中很多部分中采用的 NETBT 连接,更常见的是发送
NETBios keep-alives,所以,在 NetBios 连接中通常不发送TCP keep-alives。
TCP保持连接默认被禁用,但是微软Sockets应用程序可以使用SetSockOpt函数去启用他们。
如果客户端网络中断,服务器系统发送心跳包后,服务器会自动解除TCP连接。这一点,大家可以使用 netstat -p -tcp 命令查看
DataSnap 的连接事件顺序图
FireDAC 接占线导致另一个 hstmt DataSnap的更多相关文章
- firedac odbc sql server driver连接占线导致另一个hstmt
firedac odbc sql server driver连接占线导致另一个hstmt 原因:FDQuery.FetchOptions.Mode=fmOnDemand.好像是为了性能问题,不设置则默 ...
- DataSnap修改数据ApplyUpdates出现错误:连接繁忙导致另一个命令
最近准备尝试用DBExpress做个SQL Serer应用,在学习的时候发现一个问题使用DBExpress连接Sql server 2008 express使用以下控件SQLConnection-&g ...
- chrome 浏览器的预提取资源机制导致的一个请求发送两次的问题以及ClientAbortException异常
调查一个 pdf 打印报错: ExceptionConverter: org.apache.catalina.connector.ClientAbortException: java.net.Sock ...
- MySQL skip-character-set-client-handshake导致的一个字符集问题
http://www.quweiji.com/mysql-skip-character-set-client-handshake%E5%AF%BC%E8%87%B4%E7%9A%84%E4%B8%80 ...
- 众神看过来:IE11下鼠标中键(滚轮)导致的一个似乎无法解决的问题?!
最近在做asp.net mvc项目时遇到一个关于超链接的问题.很是纠结. 问题描述 有一个公司列表展示页.在用鼠标中键(注意了是滚轮)以下简称中键,点击编辑(超链接)的时候在该条数据的下面直接加在一个 ...
- 【Android疑难杂症】GridView动态设置Item的宽高导致第一个Item不响应或显示不正常的问题
前言 这个问题在之前做一个盒子项目时遇到过,最近又遇到了,使用GridView遇到的非常奇葩的问题,这里记录分享一下. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnb ...
- mycat 插入语句导致的一个Dobbo问题
2017-01-03 11:11:52.621 [com.alib] (): [DUBBO] Send heartbeat to remote channel /121.43.177.8:20192, ...
- 记32位程序(使用3gb用户虚拟内存)使用D3DX9导致的一个崩溃的问题
为了增加32位程序的用户虚拟内存的使用量,我们使用了/LARGEADDRESSAWARE编译选项来使32位程序可能使用到3gb的内存,能否使用到3gb内存也跟平台.系统和设置有关系,现摘抄部分作为参考 ...
- CentOS下多网卡绑定多IP段时导致只有一个会通的问题解决
原因:Linux默认开启了反向路由检查导致的,比如说外面访问eth0的网卡,而网关在eth1上,又或者从eth0出的流量,而网关在eth1上,此时会检查到网关不在同一个网卡上导致出不去,进不来的问题. ...
随机推荐
- selenium-java,cookie登陆
方法 public void login(WebDriver WebDriver,String cookie1[],String cookie2[]) throws ParseException{// ...
- 变色DNA(最短路思维题)
个人心得:太水了,还是对最短路不太深入了解,无法构建出最短路模板,然后就是读题能力, 这题的关键在于转换为最短路模板,因为DFS我在24组超时了. 假设把从i到j的代价看做是权值,那么就是对权值的确立 ...
- LeetCode My Calendar I
原题链接在这里:https://leetcode.com/problems/my-calendar-i/description/ 题目: Implement a MyCalendar class to ...
- fpga pll重配置实验总结
今天做了pll重配置的实验,输入时钟50m初始配置输出75m经重配置后输出100m,带宽为low,使用的ip:rom,altpll_reconfig ,altpll,将altpll配置为可重配置模式, ...
- groovy gradle 构建配置
参考配置 apply plugin: "idea" apply plugin: "groovy" apply plugin: "eclipse&quo ...
- python-unittest-生成测试报告
HTMLTestRunner HTMLTestRunner 是 Python 标准库的 unittest 单元测试框架的一个扩展.它生成易于使用的 HTML 测试报告. 一.目录结构 先来看一下项目的 ...
- C#操作mysql数据库,往mysql读取或者写入数据
最近在开发的一个项目,需要将数据存贮在mysql数据库中,于是需要写一个操作mysql的帮助类,我采用的是官方的,还是先给出一个链接,后面有时间的话,继续更新. http://blog.csdn.ne ...
- 队列模拟题——pat1026. Table Tennis
题意自己理解了,主要是两个队列维护,一个VIP队列,一个普通队列 搜集了一些坑(有些坑转自别的网站用于广大同学的测试之用) 普通人也有VIP的权益!!! 屌丝逆袭有木有!!! 920:52:00 10 ...
- 越来越不习惯客户端了,于是卸载了xmapp,重新配置了php+apache+mysql
Mac os 10.10默认安装的是php 5.5.4版本 默认安装的apache是2.4.9 在mysql官网下载了5.7.11,此版本安装比较简单 比较郁闷的是sudo cp /etc/php.i ...
- Warning: require(D:\wamp\www\glink-smart\bootstrap/../vendor/autoload.php): failed to open stream: No such file or directory in D:\wamp\www\glink-smart\bootstrap\autoload.php on line 1
Laravel访问出错错误信息:`Warning: require(/vendor/autoload.php): failed to open stream: No such file or dire ...