|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
|
2019/5/28 16:29:33 |
标题: |
对于FDConnection/ADOConnection掉线重新连接的问题 |
浏览:1847 |
|
加入我的收藏 |
楼主: |
公司内部一个小工具,云端Mysql 我用FDConnection去连接,做好后发现: 程序几分钟不动再去操作,必然是掉线异常,一大堆错误。
我在OnLost或者判断fdConnction.Connected等,貌似都不行。 请问各位大侠,这种情况,如何处理才好?
----------------------------------------------
- |
作者: |
|
2019/5/28 16:37:36 |
1楼: |
做成3层构架,不要直连数据库
----------------------------------------------
kittyapp
|
作者: |
|
2019/5/28 17:08:39 |
2楼: |
mysql的安全机制,超出一定时长的连接会主动断开。 当然有很多种方法可以解决此问题.比如修改mysql服务器设置不主动断,或者客户端断了重连等. 网络因素很多,一般不建议用数据库直接的方法.
----------------------------------------------
-
|
作者: |
joman (joman) |
▲▲▲▲▲ |
-
|
普通会员 |
|
2019/5/28 17:16:45 |
3楼: |
使用连接池。
----------------------------------------------
DelphiWeb开发方案(开源):https://gitee.com/pearroom/DelphiWebMVC
|
作者: |
|
2019/5/28 17:30:11 |
4楼: |
嗯,因为就是一个小工具,Mysql安装在Linux系统,不大方便做3层。 我用得就是连接池,还是一样断线呢 joman:请问详细的解决办法
谢谢
----------------------------------------------
-
|
作者: |
|
2019/5/28 17:50:49 |
5楼: |
印象中mysql自动断线的周期是以小时计,不至于几分钟掉线。
建议是建个守护线程,每N分钟(小时,秒)用指定connection访问一下, 可以是个很简单的SQL,比如select sysdate() ; 目的: 1、告诉mysql,这个连接是活的,我还要用,不要断了。 2、万一请求失败,说明连接已断,及时重连
----------------------------------------------
-
|
作者: |
|
2019/5/28 18:45:38 |
6楼: |
嗯,谢谢,之前不想这么弄是感觉比较消耗mysql资源:) 我感觉最好的办法时,使用时能有效判断一下是否连接,如果没有,则重连。 现在貌似不管是AdoConnection还是FDConnection都存在无法用Connected等相关状态去判断 必须进行对数据库进行操作才行
这样对于正常时,会消耗无谓的资源
----------------------------------------------
-
|
作者: |
joman (joman) |
▲▲▲▲▲ |
-
|
普通会员 |
|
2019/5/28 20:56:05 |
7楼: |
我不知道你链接池如何使用的,一般是 FDConnection 链接完毕使用后要释放,每次都是从链接池取新链接。
----------------------------------------------
DelphiWeb开发方案(开源):https://gitee.com/pearroom/DelphiWebMVC
|
作者: |
|
2019/5/28 22:26:01 |
8楼: |
是的每次每个业务用完就断开连接,每次用的时候再连接。
----------------------------------------------
-
|
作者: |
|
2019/5/29 13:38:36 |
9楼: |
设置断线自动重连: FDConnection1.ResourceOptions.AutoReconnect := True;
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
|
作者: |
|
2019/5/29 17:37:33 |
10楼: |
楼上,好像默认就是true吧
----------------------------------------------
-
|
作者: |
|
2019/5/29 18:07:02 |
11楼: |
@yesin119 连接池没有用对或者说理解、设置错误FireDac的连接池。
@joman 正解!如果用了连接池,是有需求的时候连接,用完就释放,何来断线之说?
连接池在二层或者三层都可以使用。
其实就算不会用连接池,动态创建应该也会吧,一样可以实现你要的功能。
----------------------------------------------
-
|
作者: |
|
2019/5/30 9:39:50 |
12楼: |
1、程序几分钟不动再去操作,必然是掉线异常,一大堆错误。 这个必定是哪里设置错误了,对当前问题的真正解决应该从这里考虑。
2、动态创建/每次用后断开,用时创建的方法通常是不可取的。 数据库连接时的开销是非常大的,通常的sql请求,计量的时间单位是ms, 而数据库连接是用秒计的。 之所以说通常,是因为还是有些场合可以每次重连的,比如 定时(长时间间隔)上传数据....
3、如果用了连接池,是有需求的时候连接,用完就释放,何来断线之说? 这个说法好像不太对,对执行操作是不需要考虑数据库连接的问题了, 可连接池里的连接就一定可用吗?初始化创建好连接池,默认连接N个, 然后。。。池里所有的连接都断了,这时不是断线吗?
----------------------------------------------
-
|
作者: |
|
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;
----------------------------------------------
生活愉快.
|
作者: |
|
2019/5/31 9:40:55 |
15楼: |
谢谢各位大侠。 使用时连接,不使用时断开,疑惑: 我使用TFDQuery打开数据集,打开后,如果马上断开FDConnection,势必FDQuery的数据也会被关闭。 那这就没有意义了
----------------------------------------------
-
|
作者: |
|
2019/5/31 10:13:25 |
16楼: |
有内存表这个东西
----------------------------------------------
-
|
|