1、数据库服务器断开连接后,客户端大量执行(我的问题出现随4000次左右query出现)query,造成MySQL client ran out of memory。
mysql的连接会偶发性的断掉,所以每次mysql_query()之前应该检查是否在连接状态(如何检查?,没发现有直接使用的api)。或执行query之后检查mysql_errno(),如果为CR_SERVER_GONE_ERROR或CR_SERVER_LOST,则需要重连。
mysql cpi (mysql_connect\mysql_query)报MySQL client ran out of memory错误,要仔细检查mysql句柄是否释放(一个MYSQL_RES句柄(mysql_store_result()得到)未是否会导致16kB内存泄漏),如果循环使用了这个过程,会造成大量泄漏而导致mysql 客户端内存耗尽,从而造成后续的重新连接也无法成功。
mysql 客户端可以有三四百M(自己粗略计算)内存用于传输数据。
简单解决方法:
每次query失败检查错误码,如果为CR_SERVER_GONE_ERROR或CR_SERVER_LOST,则做一次重连再试。
务必保证mysql_store_result()得到的结果集使用后做了释放。
2、连接数过多造成。
RealOpen(), mysql_real_connect FAILED: Can't create a new thread (errno 11); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug。
当db server对连接数的限制较低时,可能出现。
解决方法:
应用对数据库的连接数尽可能要少,以减少对db server连接内存(读缓冲区、写缓冲区)的占用。
(通常每个连接占用接近100M缓冲区(待考证))。