DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: tongxin21cn
今日帖子: 14
在线用户: 26
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 yesin119 (yesin119) ★☆☆☆☆ -
盒子活跃会员
2019/5/28 16:29:33
标题:
对于FDConnection/ADOConnection掉线重新连接的问题 浏览:635
加入我的收藏
楼主: 公司内部一个小工具,云端Mysql
我用FDConnection去连接,做好后发现:
   程序几分钟不动再去操作,必然是掉线异常,一大堆错误。

我在OnLost或者判断fdConnction.Connected等,貌似都不行。
请问各位大侠,这种情况,如何处理才好?
----------------------------------------------
-
作者:
男 bigboy2050 (bigboy2050) ★☆☆☆☆ -
注册会员
2019/5/28 16:37:36
1楼: 做成3层构架,不要直连数据库
----------------------------------------------
http://www.kittyapp.net
作者:
男 zhangpuqing (pupu) ▲▲▲▲△ -
注册会员
2019/5/28 17:08:39
2楼: mysql的安全机制,超出一定时长的连接会主动断开。
当然有很多种方法可以解决此问题.比如修改mysql服务器设置不主动断,或者客户端断了重连等.
网络因素很多,一般不建议用数据库直接的方法.
----------------------------------------------
-
作者:
男 joman (joman) ▲▲▲△△ -
注册会员
2019/5/28 17:16:45
3楼: 使用连接池。
----------------------------------------------
DelphiWebMVC官网 http://www.delphiwebmvc.com
作者:
男 yesin119 (yesin119) ★☆☆☆☆ -
盒子活跃会员
2019/5/28 17:30:11
4楼: 嗯,因为就是一个小工具,Mysql安装在Linux系统,不大方便做3层。
我用得就是连接池,还是一样断线呢
joman:请问详细的解决办法

谢谢
----------------------------------------------
-
作者:
男 hdcopy (hdcopy) ▲▲▲▲▲ -
普通会员
2019/5/28 17:50:49
5楼: 印象中mysql自动断线的周期是以小时计,不至于几分钟掉线。

建议是建个守护线程,每N分钟(小时,秒)用指定connection访问一下,
可以是个很简单的SQL,比如select sysdate() ;
目的:
1、告诉mysql,这个连接是活的,我还要用,不要断了。
2、万一请求失败,说明连接已断,及时重连
----------------------------------------------
-
作者:
男 yesin119 (yesin119) ★☆☆☆☆ -
盒子活跃会员
2019/5/28 18:45:38
6楼: 嗯,谢谢,之前不想这么弄是感觉比较消耗mysql资源:)
我感觉最好的办法时,使用时能有效判断一下是否连接,如果没有,则重连。
现在貌似不管是AdoConnection还是FDConnection都存在无法用Connected等相关状态去判断
必须进行对数据库进行操作才行

这样对于正常时,会消耗无谓的资源
----------------------------------------------
-
作者:
男 joman (joman) ▲▲▲△△ -
注册会员
2019/5/28 20:56:05
7楼: 我不知道你链接池如何使用的,一般是 FDConnection 链接完毕使用后要释放,每次都是从链接池取新链接。
----------------------------------------------
DelphiWebMVC官网 http://www.delphiwebmvc.com
作者:
男 ksrsoft (cb168) ★☆☆☆☆ -
注册会员
2019/5/28 22:26:01
8楼: 是的每次每个业务用完就断开连接,每次用的时候再连接。
----------------------------------------------
-
作者:
男 earthsbest (全能中间件) ▲▲△△△ -
注册会员
2019/5/29 13:38:36
9楼: 设置断线自动重连:
FDConnection1.ResourceOptions.AutoReconnect := True;
----------------------------------------------
Delphi4Linux交流群:734515869 http://www.cnblogs.com/rtcmw
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2019/5/29 17:37:33
10楼: 楼上,好像默认就是true吧
----------------------------------------------
-
作者:
男 nickemma (N.E) ▲▲▲▲△ -
注册会员
2019/5/29 18:07:02
11楼: @yesin119
连接池没有用对或者说理解、设置错误FireDac的连接池。

@joman 正解!如果用了连接池,是有需求的时候连接,用完就释放,何来断线之说?

连接池在二层或者三层都可以使用。

其实就算不会用连接池,动态创建应该也会吧,一样可以实现你要的功能。
----------------------------------------------
-
作者:
男 hdcopy (hdcopy) ▲▲▲▲▲ -
普通会员
2019/5/30 9:39:50
12楼: 1、程序几分钟不动再去操作,必然是掉线异常,一大堆错误。
这个必定是哪里设置错误了,对当前问题的真正解决应该从这里考虑。

2、动态创建/每次用后断开,用时创建的方法通常是不可取的。
数据库连接时的开销是非常大的,通常的sql请求,计量的时间单位是ms,
而数据库连接是用秒计的。
之所以说通常,是因为还是有些场合可以每次重连的,比如
定时(长时间间隔)上传数据....

3、如果用了连接池,是有需求的时候连接,用完就释放,何来断线之说?
这个说法好像不太对,对执行操作是不需要考虑数据库连接的问题了,
可连接池里的连接就一定可用吗?初始化创建好连接池,默认连接N个,
然后。。。池里所有的连接都断了,这时不是断线吗?
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲▲ -
普通会员
2019/5/30 9:59:03
13楼: 我们的程序,任意一个按钮
任意一个操作
任意一个任务。
他们都有共同的开头。
打开数据源。
成功打开之后,继续应该做的代码。
打开不成功。那肯定不是超时。那肯定是连不上。
因为,都是断开重连的。
我们的代码,认为,我们的数据库连接永远都是关闭的。所以,想要用数据库,都会去主动连接。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 dmzn (dmzn) ★☆☆☆☆ -
盒子活跃会员
2019/5/30 10:35:20
14楼: SQL异常时,先执行一次Select 1判断是连接异常还是SQL异常,,若是连接异常,断开重连.

//Desc: 执行查询语句
function TDBConnManager.WorkerQuery(const nWorker: PDBWorker;
  const nSQL: string): TDataSet;
var nStep: Integer;
    nException: string;
begin
  Result := nWorker.FQuery;
  nException := '';
  nStep := 0;

  while nStep <= 2 do
  try
    if nStep = 1 then
    begin
      nWorker.FQuery.Close;
      nWorker.FQuery.SQL.Text := 'select 1';
      nWorker.FQuery.Open;

      nWorker.FQuery.Close;
      Break;
      //connection is ok
    end else

    if nStep = 2 then
    begin
      nWorker.FConn.Close;
      nWorker.FConn.Open;
    end; //reconnnect
    
    nWorker.FQuery.Close;
    nWorker.FQuery.SQL.Text := nSQL;
    nWorker.FQuery.Open;

    nException := '';
    Break;
  except
    on E:Exception do
    begin
      Inc(nStep);
      nException := E.Message;
    end;
  end;

  if nException <> '' then
  begin
    WriteLog('SQL: ' + nSQL + ' ::: ' + nException);
    raise Exception.Create(nException);
  end;
end;
此帖子包含附件:dmzn_2019530103520.txt 大小:998B
----------------------------------------------
生活愉快.
作者:
男 yesin119 (yesin119) ★☆☆☆☆ -
盒子活跃会员
2019/5/31 9:40:55
15楼: 谢谢各位大侠。
使用时连接,不使用时断开,疑惑:
我使用TFDQuery打开数据集,打开后,如果马上断开FDConnection,势必FDQuery的数据也会被关闭。
那这就没有意义了
----------------------------------------------
-
作者:
男 nickemma (N.E) ▲▲▲▲△ -
注册会员
2019/5/31 10:13:25
16楼: 有内存表这个东西
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行62.5毫秒 RSS