|
|
导航: |
论坛 -> 数据库专区
斑竹:liumazi,waterstone |
|
作者: |
|
2020/11/5 11:39:38 |
标题: |
7*24数据库服务器隔段时间就莫名其妙死掉的问题 |
浏览:2276 |
|
加入我的收藏 |
楼主: |
1、服务器是用的单线程(一开始是用线程池,怀疑线程池问题就用了单线程),接收到请求,放到队列里,线程去执行数据库操作,执行MySql存储过程,业务都是写成存储过程,用的UniDac,所以我的服务器主要就是执行一下存储过程。 2、UniDac因为会断开连接,就用了它的ConnectionLost方法重连事件,但这个方法事件虽然会重连,但是当前连接会失败(下一次是会连接上),这个对我当前业务有很大问题,因为有很多早上自动连接数据库执行的操作,失败了就发现不了(因为不是人工操作的,人工操作可以看到提示),所以,看官方论坛建议,加了个定时执行数据库存储过程的功能。 3、今天看日志就是停在定时执行存储过程的时候,我有打印很多日志。开了两个服务器,一个是运行了33天,一个是运行了10来天。是早上,没有请求过来,就是只有自己定时执行的操作。 4、想问一下,针对我的场景,就是执行数据库存储过程功能有没有什么好的方案或者建议?
----------------------------------------------
- |
作者: |
|
2020/11/5 12:04:51 |
1楼: |
这种情况多半是内存泄漏,或者该回收的资源没有回收导致。
----------------------------------------------
-
|
作者: |
|
2020/11/5 13:44:48 |
2楼: |
如果是MSSQL,需要在企业管理器里设置最大内存上限,否则内存会一直加大,直到内存上限崩溃。
----------------------------------------------
山外青山楼外楼,能人背后有能人弄..
|
作者: |
|
2020/11/5 18:45:25 |
3楼: |
直接利用Mysql Event在数据库后台定时RUN SP。
----------------------------------------------
-
|
作者: |
|
2020/11/6 8:45:20 |
4楼: |
1、如果并发量不是很大,为了安全最简单的方法就是每次都创建Connection. 2、如果不想每次都创建,可以建个池,放几个Connection,加锁从池中取。取到用完之后就close,每次用之前再连接。这样可以避免时间过长造成死连接。
----------------------------------------------
Delphi爱好者。
|
作者: |
|
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 各自检查内存泄露 ~
----------------------------------------------
-
|
作者: |
|
2020/11/6 16:12:22 |
7楼: |
我用 ado 比较稳定,服务器程序运行几个月 都不会有什么问题的。
----------------------------------------------
-
|
作者: |
|
2020/11/6 17:01:17 |
8楼: |
建议使用datasnap rest+firedac处理
----------------------------------------------
-
|
作者: |
|
2020/11/6 17:19:25 |
9楼: |
说一个实际的例子:
在 Delphi 1 的年代,数据库是 BDE,写入数据库用 TTable 或者 TQuery。 我当时做了一个连续接收串口数据然后写数据库的程序,跑一周后就会死掉。
想来想去,这种情况多半是内存问题。于是仔细翻代码,把所有的 TTable 都加上每天晚上半夜 Close 再 Open 的代码。问题消失。
其实就是我当时对 TTable 的理解不深刻,不知道它是在内存里面有记录,虽然 Post 写入数据库了,但它自己的内存记录还在。一直写入就一直增加。所以改为定期 Close 一下,问题就解决了。
数据库操作就是对几个数据库控件的操作,还比较好查。如果有自己写的对象,创建了对象又没释放,一直创建,也可能出现类似问题,可能还不容易查到。
如果自己有指针操作,分配内存,代码写复杂了,就更难查。
但这些,都是自己写代码没写好的问题。而不是某个数据库的问题,不是存储过程的问题。当然,具体到某个数据库,它有什么设置需要注意,也是需要小心的。
----------------------------------------------
-
|
作者: |
|
2020/11/7 0:06:43 |
10楼: |
@pcplayer 谢谢,检查后发现了很多地方,就是DLL里没有调用Close去关闭UniStoreProc。现在重新改了再看一下。 @hecongzhen ADO有断线重连的机制吗?或者它可以一直不断开。 @sxqwhxq 我们的场景不能用DataSnap,我们是用了消息中间件,我的服务器订阅消息中间件上的消息,消息中间件转发消息功能号到我的服务器,我的服务器接收到了功能号,再放入队列,分给对应的业务DLL处理。
----------------------------------------------
-
|
|