发现问题
前些日子维护编写的通讯服务器时遇到了这么一个问题:在通讯服务器里有一个数据库连接池,为他人提供数据库连接服务,结果发现在使用过程中连接有时会耗尽,这个问题通过调试跟踪发现,有“客户”在使用数据库连接时,总是不释放连接(已提供了释放连接的方法)。其实问题很好解决,找出未释放连接的那个“客户”然后按照GetConnection,ReleaseConnection的方式来正确调用就可以了。
解决问题?
但是找出那个“客户”很容易吗?看看我们的整个系统吧,多达五个子系统插件在使用这个服务,而且其中的数据库连接调用很多,这样找可费了大劲了。在经过大量的代码审核后,终于找出未释放连接的那个客户,解决了这个问题。

思考之下,作为一个关键的公共服务是不是可以做相应优化来应对这种“客户”犯下的错误。
采用RAII机制,把释放链接的那个方法也写入析构函数中
举例(采用伪码加不标准类写法方式,主要是说明思路;参考effective c++章节2 构造/析构)
class ConnectionPool
{
public:

...

~ConnectionPool(void);
  {
    if (!bRelease)
    {
      Release连接();
    }
  }

void  ReleaseConnection()
  {
    Release连接();
    bRelease = true;
  }
private:

bool  bRelease;     (初始化为false)
};

这样”客户“如果是采用栈或智能指针实例化的对象来使用服务,即使忘记释放连接都可以利用RAII机制安全释放;
但是如果”客户“直接用new出的对象使用服务忘记释放连接呢,又回到了最先遇到的问题上,在一大推调用里找究竟是谁未释放连接。继续解决:
既然现在我们的困扰集中在找违规”客户“的麻烦上,想想图书馆借书,谁借去了必须把他的名字登记下来,谁谁谁借走了这本书,到时候即使他不还,咱也有办法找到他让他给咱还回来。于是我们可以再改造一下这个服务,在每个”客户“获得连接时都传入他的标识然后把这个连接和标识捆绑起来。这样,哪个”客户“未释放连接一目了然了吧,立马找到他让他改正。OK,快速解决。

由数据库连接池想到的----处理他人未释放的资源相关推荐

  1. 手动查看和删除IPC未释放的资源

    1,举一个造成IPC资源未释放的例子: eg:使用共享队列,在程序未主动释放共享队列资源的时候,ctrl+c: 导致申请的共享队列资源未被操作系统回收. 2,查看系统中没被释放的IPC资源 ipcs ...

  2. 解决矩池云GPU显存未释放问题

    很多用户反馈说终止程序之后,显存依然被占用,这里我们提供了两种解决方案,帮助用户解决这个问题. nvidia-smi查看 我们可以先用如下命令 nvidia-smi 查看一下当前GPU进程情况. _ ...

  3. java 连接池 druid_从零开始学 Java - 数据库连接池的选择 Druid

    我先说说数据库连接 数据库大家都不陌生,从名字就能看出来它是「存放数据的仓库」,那我们怎么去「仓库」取东西呢?当然需要钥匙啦!这就是我们的数据库用户名.密码了,然后我们就可以打开门去任意的存取东西了. ...

  4. Java中几个主流的数据库连接池

    池(Pool)技术在一定程度上可以明显优化服务器应用程序的性能,提高程序执行效率和降低系统资源开销.这里所说的池是一种广义上的池,比如数据库连接池.线程池.内存池.对象池等.其中,对象池可以看成保存对 ...

  5. 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明

    转载自  常用数据库连接池 (DBCP.c3p0.Druid) 配置说明 1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的 ...

  6. 【知了堂学习笔记】数据库连接池简介,以及Eclipse中C3p0连接池的简单运用

    1.普通的JDBC连接数据库的弊端 普通的JDBC数据库连接使用 DriverManager 来获取,每次向数据库建立连接的时候都要将 Connection 加载到内存中,再验证用户名和密码(得花费0 ...

  7. 数据库连接池的作用及c3p0的详解(转载他人的--合理掌握学习方式)

    ----转载 1.JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: 在主程序(如servlet.beans)中建立数据库连接. 进行sql操作 断开数据库 ...

  8. jsp获取连接池的实时连接数_数据库连接池原理分析及模拟实现

    数据库访问 访问数据库主要有以下几个步骤: 加载数据库驱动 创建数据库连接 执行访问操作并处理执行结果 关闭连接,释放资源 在每一次请求数据库都要经历上述过程,创建连接和释放资源也都是些重复性的动作, ...

  9. 【张小平工作日志】DBCP、c3p0、Druid、Proxool数据库连接池比较

    定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正是针对这个问 ...

  10. 数据库连接池 (DBCP、c3p0、Druid) 配置说明和对比

    1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出. 对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据 ...

最新文章

  1. 基于卷积神经网络(CNN)的仙人掌图像分类
  2. iMeta期刊推特官方帐号@iMetaJournal上线
  3. 前端路由简介以及vue-router实现原理
  4. Java实现min函数_AcWing 41. 包含min函数的栈--Java代码
  5. boost::log::keywords::format用法的测试程序
  6. Gateway网关-快速入门
  7. python实现关联算法_python使用Apriori算法进行关联性解析
  8. Redis 5种数据结构使用及注意事项
  9. JAVA计算一年的第几天问题
  10. 致谢计算机组成原理老师的致谢,计算机组成原理课程报告(40页)-原创力文档...
  11. Linux系统故障排查和修复技巧
  12. (十一)【数电】(组合逻辑电路)数据分配器和数据选择器
  13. C++代码审查工具Cppcheck和TscanCode
  14. 《广义动量定理与系统思考——战争、…
  15. 硬件编码相关知识(H264,H265)
  16. 计算机安全证书有问题怎么办,此网站的安全证书有问题如何取消 此网站的安全证书有问题解决方法...
  17. 【高数】【本科笔记】【第七章 微分方程】【7.2 可分离变量的微分方程】
  18. 使用超链接实现企业QQ在线客服
  19. 2. Python decorate
  20. 深度学习学习笔记——keras中的verbose

热门文章

  1. 关于getResource和getClassLoader().getResource()
  2. 一招解决二级域名下session失效问题
  3. BZ OJ 2818 Gcd (欧拉函数)
  4. 如何JOPtionPane的showConfirmDialog对话框button设置监视器
  5. bnuoj4220素数难题
  6. js替换问题replace和replaceAll
  7. wordpress and theme
  8. c语言的编译器还真是不好理解...
  9. 近期生活中将会发生的一点变化!
  10. vue学习笔记-vue双向数据绑定