2014-7-13日8号托管再现了近期频繁的现象:队列阻塞导致对客户端无响应,最后或提示超时。
所幸该托管的日志级别是调试级,该级别会输出无空闲连接时连接使用情况,因此才得以继续分析解决.hotfox配置的本地连接数是35个.日志中显示,在阻塞之前各个scheduler处理线程出现了等待数据库连接却永远无法获得的记录。
[2014-07-13 08:15:18:784][线程7276][1][20][0][][32]连接id=32,使用状态=已使用,取用时间=25(秒),拥有者线程=7276.
[2014-07-13 08:15:18:800][线程7276][1][20][0][][33]连接id=33,使用状态=已使用,取用时间=24(秒),拥有者线程=6868.
[2014-07-13 08:15:18:800][线程7276][1][20][0][][34]连接id=34,使用状态=已使用,取用时间=25(秒),拥有者线程=5164.
[2014-07-13 08:15:18:800][线程7276][1][20][0][][35]连接id=35,使用状态=已使用,取用时间=24(秒),拥有者线程=4572.
[2014-07-13 08:15:09:269][线程6868][1][20][0][][33]连接id=33,使用状态=已使用,取用时间=15(秒),拥有者线程=6868.
[2014-07-13 08:15:34:753][线程4572][1][20][0][][35]连接id=35,使用状态=已使用,取用时间=40(秒),拥有者线程=4572.
通知只有在成功写入数据库后才执行,采用事务挂钩的异步方式处理.
代码中的注释说明是为了避免事务hook产生递归.(现在有些不确定了).
int CSEMQ::Save(CSEMQItem &qe,vector
USENEWDBC(new_pdbor,this->dbc_name_.c_str());
CSequencer sequencer(new_pdbor);
__int64 object_id ;
if (sequencer.NextVal(object_id,31)) { ///< 获取tb_0031的序列值
return -1;
}
相关定义:
bool auto_new_;///< 是否允许自动创建新的连接对象(当没有超时限制时避免死锁),默认:true
unsigned long max_count_; ///< 可扩大连接池时,连接数可达到的最大数量. -1表示无限制.默认:-1
unsigned short new_timeout_; ///< 自动创建新连接对象前等待的超时时间,单位:秒.默认:10.
这种方法可以在不升级程序的情况下解决问题.
.
.使用数据库的后台线程数.
如对于以下配置,
20
50