还有一个提高效率的方法,与泛型无关。
数据库连接句柄打开开销较大,一般需要30~40ms,如果在功能模块里开,性能降低一半不止。如果常开,在多线程服务器环境不合适。
所以采用了数据库连接池,虽然很多数据库提供了内建的连接池,那与我无关。
连接池在开始时是一个连接也不开。第一个使用者取用时打开一个连接,用完归还时,如果是正常归还,不关闭,就加到空闲队列头。下一次有人用就优先取已经打开的。因数据库致命故障归还的,就关闭,回收资源,放到队尾。
一个定时器线程定时扫描连接池健康度,有超过一定时间(一般是5分钟)不用的连接就关闭之。
这是一种极为可靠的连接池健康保障法。
一般的策略是保活,这很难的,你怎么发个信息并得到应答从而确定其活不活?如果那边太忙无暇顾及你,是否会误判?你想检查的连接正在被别人使用怎么办?
我的策略是保死,只检查空闲队列,没人用就弄死,不要老占着资源。有的数据库是按连接数付费的,没事别占着茅坑不拉屎,现用现开,最健康。保活的话,检查一次空闲队列需要很长时间,不知道需要多长时间才能得到一个应答,保死的只看时间戳,检查的非常快,锁队列的时间非常短。
实践中这个方法简单而可靠。数据库崩溃,服务器不必restart,等着数据库恢复即可,这叫自愈式连接池。
连接池技术完美的解决了当年的 长连接与短连接之争。
【 在 DoorWay 的大作中提到: 】
: 高效的三个维度
: 对底层内存与驱动的“零抽象”
: ===
: ...................
--
修改:ylh1969 FROM 221.221.54.*
FROM 221.221.54.*