DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: shz0000
今日帖子: 34
在线用户: 16
导航: 论坛 -> 数据库专区 斑竹:liumazi,waterstone  
作者:
男 xiaoxingliang1 (xiaoxingliang1) ★☆☆☆☆ -
普通会员
2020/11/5 11:39:38
标题:
7*24数据库服务器隔段时间就莫名其妙死掉的问题 浏览:2276
加入我的收藏
楼主: 1、服务器是用的单线程(一开始是用线程池,怀疑线程池问题就用了单线程),接收到请求,放到队列里,线程去执行数据库操作,执行MySql存储过程,业务都是写成存储过程,用的UniDac,所以我的服务器主要就是执行一下存储过程。
2、UniDac因为会断开连接,就用了它的ConnectionLost方法重连事件,但这个方法事件虽然会重连,但是当前连接会失败(下一次是会连接上),这个对我当前业务有很大问题,因为有很多早上自动连接数据库执行的操作,失败了就发现不了(因为不是人工操作的,人工操作可以看到提示),所以,看官方论坛建议,加了个定时执行数据库存储过程的功能。
3、今天看日志就是停在定时执行存储过程的时候,我有打印很多日志。开了两个服务器,一个是运行了33天,一个是运行了10来天。是早上,没有请求过来,就是只有自己定时执行的操作。
4、想问一下,针对我的场景,就是执行数据库存储过程功能有没有什么好的方案或者建议?
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2020/11/5 12:04:51
1楼: 这种情况多半是内存泄漏,或者该回收的资源没有回收导致。
----------------------------------------------
-
作者:
男 zyp1984 (小李他妈的飞刀) ★☆☆☆☆ -
普通会员
2020/11/5 13:44:48
2楼: 如果是MSSQL,需要在企业管理器里设置最大内存上限,否则内存会一直加大,直到内存上限崩溃。
----------------------------------------------
山外青山楼外楼,能人背后有能人弄..
作者:
男 dlfsystem (dlfsystem) ★☆☆☆☆ -
盒子活跃会员
2020/11/5 18:45:25
3楼: 直接利用Mysql Event在数据库后台定时RUN SP。
----------------------------------------------
-
作者:
男 ghs_79 (ghs) ★☆☆☆☆ -
盒子活跃会员
2020/11/6 8:45:20
4楼: 1、如果并发量不是很大,为了安全最简单的方法就是每次都创建Connection.
2、如果不想每次都创建,可以建个池,放几个Connection,加锁从池中取。取到用完之后就close,每次用之前再连接。这样可以避免时间过长造成死连接。
----------------------------------------------
Delphi爱好者。
作者:
男 xiaoxingliang1 (xiaoxingliang1) ★☆☆☆☆ -
普通会员
2020/11/6 9:26:20
5楼: 谢谢大家。
@pcplayer 内存泄漏是得好好检查一下,因为我这个是DLL模式,我只写主程序,业务是划分成一个个DLL,主程序里传出UniStoreProc,UniQuery给DLL,别人写的,看看是不是每次没有Close方法关掉UniStoreProc,UniQuery之类的控件。
@zyp1984 我是用的MySql 
@dlfsystem 我这个不能定时执行,是用了消息中间件来接受请求的,有请求才会去执行。 
@ghs_79 楼上的好建议,会试一下,我现在是定时执行一个存储过程保持连接。
----------------------------------------------
-
作者:
男 lsuper (lsuper) ★☆☆☆☆ -
盒子活跃会员
2020/11/6 9:52:46
6楼: 先所有 exe dll 带 FastMM4 各自检查内存泄露 ~
----------------------------------------------
-
作者:
女 hecongzhen (令狐**) ★☆☆☆☆ -
普通会员
2020/11/6 16:12:22
7楼: 我用 ado 比较稳定,服务器程序运行几个月 都不会有什么问题的。
----------------------------------------------
-
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2020/11/6 17:01:17
8楼: 建议使用datasnap rest+firedac处理
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2020/11/6 17:19:25
9楼: 说一个实际的例子:

在 Delphi 1 的年代,数据库是 BDE,写入数据库用 TTable 或者 TQuery。
我当时做了一个连续接收串口数据然后写数据库的程序,跑一周后就会死掉。

想来想去,这种情况多半是内存问题。于是仔细翻代码,把所有的 TTable 都加上每天晚上半夜 Close 再 Open 的代码。问题消失。

其实就是我当时对 TTable 的理解不深刻,不知道它是在内存里面有记录,虽然 Post 写入数据库了,但它自己的内存记录还在。一直写入就一直增加。所以改为定期 Close 一下,问题就解决了。

数据库操作就是对几个数据库控件的操作,还比较好查。如果有自己写的对象,创建了对象又没释放,一直创建,也可能出现类似问题,可能还不容易查到。

如果自己有指针操作,分配内存,代码写复杂了,就更难查。

但这些,都是自己写代码没写好的问题。而不是某个数据库的问题,不是存储过程的问题。当然,具体到某个数据库,它有什么设置需要注意,也是需要小心的。
----------------------------------------------
-
作者:
男 xiaoxingliang1 (xiaoxingliang1) ★☆☆☆☆ -
普通会员
2020/11/7 0:06:43
10楼: @pcplayer 谢谢,检查后发现了很多地方,就是DLL里没有调用Close去关闭UniStoreProc。现在重新改了再看一下。
@hecongzhen ADO有断线重连的机制吗?或者它可以一直不断开。
@sxqwhxq 我们的场景不能用DataSnap,我们是用了消息中间件,我的服务器订阅消息中间件上的消息,消息中间件转发消息功能号到我的服务器,我的服务器接收到了功能号,再放入队列,分给对应的业务DLL处理。
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行70.3125毫秒 RSS