Chinaunix

标题: Linux下OCI接口的问题 [打印本页]

作者: tianqiang2516    时间: 2011-10-06 21:52
标题: Linux下OCI接口的问题
我正在写一个linux 下利用OCI接口的Oracle数据库连接池的程序。
我想定时检测连接池中建立的连接是否可用,请问使用什么方法?
注:连接池类中有成员变量
                OCIEnv *envhp_m;        /*!< 环境句柄*/
                        OCIServer *srvhp_m;     /*!< 服务器句柄*/
                        OCISvcCtx *svchp_m;     /*!< 服务上下文句柄*/
                        OCIError *errhp_m;      /*!< 错误信息句柄*/
在不同的连接会话类里面有不同的成员变量OCISession *authp_m;  /*!< 会话句柄 */
每个连接会话类共享连接池类中的变量。
作者: yulihua49    时间: 2011-10-08 16:17
本帖最后由 yulihua49 于 2011-10-08 16:32 编辑
我正在写一个linux 下利用OCI接口的Oracle数据库连接池的程序。
我想定时检测连接池中建立的连接是否可用, ...
tianqiang2516 发表于 2011-10-06 21:52


我是这么做的:
连接池初始化时,并不打开连接。池的每一个成员都有一个状态,初值=-1,无连接。
客户取连接时,发现无连接,就发起连接。如果成功,状态改0,并返回句柄,不过这是个应用句柄。包括数据库的各种句柄,和状态。
如果连接失败,状态依然是-1,并告诉客户,连接失败,稍后再来。

客户操作过程,如果发生错误,是连接失效,则状态置-1,归还连接。归还连接函数,发现-1,
立即关闭这个失效的连接。资源是正常返回池里。
还有一个定时的线程,专门检查连接池的健康。发现一个连接空闲了超过一定时间(5分钟)将自动关闭这个连接。
这样,检查连接是否有效的操作就不需要了。

当然在数据库故障时,客户可能夭折一个交易。不过不要紧,当数据库恢复时,连接池自愈。

这个逻辑使连接池的健康管理大大简化了。已经开发了许多可靠的应用系统。
作者: tianqiang2516    时间: 2011-10-20 19:21
回复 4# yulihua49


谢谢你的回答~
   
连接超时关闭是个不错的方法,可是定时器怎么实现呢?有现成的工具吗?

另外我的想法是用一个专门的线程检测各个已用连接,怎么样检测才算是连接活跃?怎么样检测才算是连接失效呢?
作者: yulihua49    时间: 2011-10-21 12:47
本帖最后由 yulihua49 于 2011-10-21 12:49 编辑
回复  yulihua49


谢谢你的回答~
   
连接超时关闭是个不错的方法,可是定时器怎么实现呢?有现成的 ...
tianqiang2516 发表于 2011-10-20 19:21



    证明连接有效,是个复杂问题,所以才有了我那个逻辑来回避这个问题。

现在在高可用性领域有两个复杂问题。一个是这个。另一个是在HA系统里如何证明活动的主机没有死亡(如果它死亡了,就会有别人来接管它)。
作者: renxiao2003    时间: 2011-10-22 17:49
建议楼主在C++区再问问。我不会C++




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2