发明内容
有鉴于此,本发明实施例的目的在于提供查找连接池中未释放的连接的方法和装置,快速而有效地查找为关闭连接的方法来解决连接池的连接泄露问题。
为实现上述目的,本发明实施例提供了如下技术方案:
一种查找连接池中未释放的连接的方法,包括:
在物理连接与用户连接的关联建立后,对当前处于使用状态的物理连接进行标识;
本次调用结束后,判断本次调用中使用的物理连接是否还具有所述标识,如果是,则确定所述物理连接即为未释放的物理连接;
所述对当前处于使用状态的物理连接进行标识具体为:
为所述物理连接和所述用户连接创建连接中介;
将所述连接中介记录到调用上下文中;
判断本次调用中使用的物理连接是否具有所述标识具体为:
检查所述记录中是否还有本次调用中使用的连接中介。
所述方法还包括:
解除所述未释放的物理连接和与其对应的用户连接之间的关联;
删除物理连接具有的所述标识。
所述本次调用结束后,还包括:
接收客户端发出的关闭连接指示;
根据所述关闭连接指示解除所述物理连接与所述用户连接之间的关联;
删除物理连接具有的所述标识。
所述物理连接与所述用户连接的关联通过以下方式建立:
根据所述物理连接创建一个与所述物理连接相对应的用户连接;
或者,为所述物理连接关联一个已经存在的用户连接。
所述物理连接为连接池中的空闲连接或者为根据客户端的连接请求新建的一个物理连接。
所述方法还包括:
将解除了关联的所述物理连接放入连接池;
或者,关闭所述解除了关联的物理连接。
一种查找连接池中未释放的连接的装置,包括:
标识单元,用于在物理连接与用户连接的关联建立后,对当前处于使用状态的物理连接进行标识;
检测单元,用于在调用结束后,检测本次调用中使用的物理连接是否还具有标识单元对所述物理连接进行的标识,如果有,则确定所检测的连接为未释放的物理连接;
所述标识单元具体包括:
创建子单元,用于为所述物理连接和所述用户连接创建连接中介;
记录子单元,用于将所述创建子单元创建的连接中介进行记录。
所述装置还包括:
第一释放单元,用于在所述检测单元检测出未被释放的物理连接后,解除所述未释放的物理连接和与其对应的用户连接之间的关联,删除物理连接具有的所述标识。
上述装置还包括:
接收单元,用于接收调用结束后客户端发出的关闭连接指示;
所述第一释放单元,还用于根据所述接收单元接收的所述关闭连接指示解除所述物理连接和与其对应的用户连接之间的关联,删除物理连接具有的所述标识。
上述装置还包括:
第二释放单元,用于将被第一释放单元解除关联的物理连接放回连接池或者关闭。
可见,在本发明实施例中,在物理连接与用户连接的关联建立后,对当前处于使用状态的物理连接进行标识;本次调用结束后,判断本次调用中使用的物理连接是否还具有所述标识,如果是,则确定所述物理连接即为未释放的物理连接,通过调用前对物理连接进行标识,调用后对所述标识检查来查找为关闭的连接,整个过程中不需要人工参与,高效率地查找出未关闭的连接,解决了连接泄露的问题。
具体实施方式
本发明实施例提供了查找连接池中未释放的连接的方法和装置,下面结合附图对本发明实施例进行详细描述。
如前所述,当应用程序使用连接池技术时,连接资源仍然是有限的资源,因此使用完以后,一样需要把连接关闭。在连接池技术中引入了用户连接这个概念,把应用程序和物理连接隔离开来,应用程序操作的是用户连接,而对用户连接的操作会被传递到物理连接上,EIS通过物理连接返回的响应也会通过用户连接返回给应用程序。当应用程序使用完连接后,执行关闭连接的操作,此时关闭的就是用户连接,物理连接则会被返回到连接池,而不是被关闭掉,以缓存起来供下一次访问使用,达到复用物理连接的目的。用户连接与物理连接的关系一般是一对一的,但在一些场景下,可能是多对一的。
在有了连接池技术以后,当企业应用程序中需要跟EIS通信时,从连接池获取物理连接,而不是直接创建一个到EIS的物理连接,由于连接池的连接是预先创建好的,因此不需要频繁创建连接,节省了***资源,带来可观的效率提升。但是EIS的连接资源是有限的,不能无限制的申请,因此应用程序完成跟连接相关的操作以后,应用程序必须负责关闭连结,连接关闭后,连接管理器就解除用户连接与物理连接的关联,将物理连接放回连接池,以供别的线程使用,从而达到复用连接的目的。
连接泄露的出现就是应用程序在连接调用完成后不关闭连接造成的,本发明实施例的方法就是为了解决连接泄露的问题而提出的。
参见图1,在本发明一实施例中,实现本发明实施例所提供的方法具体包括:
步骤101:在物理连接与用户连接的关联建立后,对当前处于使用状态的物理连接进行标识;
其中,所述标识为:
为所述物理连接和所述用户连接创建连接中介;
将所述连接中介进行记录。
在实际应用中,可以通过将所述连接中介注册到调用上下文中来实现对所述连接中介的记录。
步骤102:本次调用结束后,判断本次调用中使用的物理连接是否还具有所述标识,如果是,则所述物理连接即为未释放的物理连接。
当查出未释放的物理连接后,还包括:
步骤103:解除所述未释放的物理连接和与其对应的用户连接之间的关联,删除物理连接具有的所述标识。
当调用结束后,通过对所述标识的检查来判断调用过程中使用的物理连接是否已经被释放,如果还有所述标识,即记录中还有本次调用中创建的连接中介,则说明该连接中介对应的物理连接还没有被释放,所述物理连接与用户连接之间的关联还没有被解除,通过解除所述物理连接与所述用户连接之间的关联,删除所述连接中介释放所述物理连接。
优选地,在本次调用结束后,还包括:
接收客户端发出的关闭连接指示;
根据所述关闭连接指示解除所述物理连接与所述用户连接之间的关联;
删除物理连接具有的所述标识。
调用结束后,如果应用程序没有忘记关闭连接,那么通过发送关闭连接指示通知连接池关闭连接,连接池根据所述连接指示进行关闭连接的工作,最后释放物理连接。
参见图2,本发明又一实施例所提供的方法具体包括:
步骤201:客户端向连接管理器发送连接请求,请求建立连接。
在本发明实施例中,该连接请求为一个新的连接调用请求;在其他实施例中,该连接请求也可以是为一个已经存在的用户连接关联一个物理连接的连接请求。
步骤202:连接管理器根据所述连接请求向连接池申请一个物理连接。
步骤203:连接池根据所述连接请求返回一个物理连接。
当该连接请求为一个已经存在的用户连接关联一个物理连接的连接请求时,在该连接请求中携带有该用户连接信息。
所述物理连接为连接池根据所述连接请求而创建的一个新的物理连接;
或者,为连接池中一个原有的空闲的物理连接。
步骤204:连接管理器接收到连接池返回的物理连接后,为所述物理连接分配一个用户连接。
当接收到的连接请求是为一个已经存在的用户连接关联一个物理连接的连接请求时,所述分配工作具体为:
将获取的物理连接与接收请求中的用户连接进行关联。
步骤205:根据所述物理连接和用户连接创建连接中介。
该连接中介包括所述物理连接与所述用户连接之间的连接关系,例如物理连接为2号连接,与其对应的用户连接为3号连接,那么所述连接中介中就包括:2号物理连接与3号用户连接相连的信息。
步骤206:将所述连接中介注册到调用上下文中。
在本发明实施例中通过将所述连接中介注册到调用上下文中来实现对所述连接中介的记录。
调用上下文用于动态管理注册在其中的连接中介,当调用开始前对注册在其中的连接中介进行保存;当调用结束后,客户端指示连接管理器从调用上下文中删除与当次调用相对应的连接中介。
步骤207:将用户连接返回给客户端。
步骤208:使用该用户连接进行数据调用。
步骤209:调用结束后,客户端向连接管理器发送关闭连接指示。
步骤210:连接管理器解除本次调用中物理连接与用户连接之间的关联,删除所有本次调用使用的连接中介。
在本发明实施例中,连接中介建立在物理连接中,当注册在调用上下文中的连接中介被删除时,同时删除建立在该物理连接中的连接中介。
步骤211:检查调用上下问文中是否还有本次调用相对应的连接中介,如果有,执行步骤210。
实际应用中,步骤210之后,还包括:
将解除了连接关联的物理连接回归连接池;
或者,在连接池已满时,直接将所述解除了连接关联的物理连接关闭。
实际上,连接中介相当于对一个物理连接的标识,即如果一个物理连接正在处于一次调用过程中,那么其包含的连接中介就表明在该此调用中该物理连接是与哪个用户连接结合实现该次调用的;相应的,当一次调用结束后,通过将物理连接包含的连接中介删除,就将对该物理连接的标识去掉,如果该物理连接被返回连接池,此时,就表明该物理连接还没有被使用,处于可用状态。
通过本发明实施例所提供的方法,在调用开始前建立物理连接与其所对应的用户连接之间的连接中介,并将其注册到调用上下文中;此时就相当于通过调用上下文对该用户连接和物理连接进行了记录;调用结束后,如果按照步骤109执行即可正常关闭连接,解除用户连接与物理连接的关系,使物理连接可以回到连接池,从而实现对物理连接的复用;但是,如果应用程序忘记在本发明实施例中即忘记执行步骤209,那么通过步骤210的检查,利用调用前对物理连接和用户连接的记录,保证了用户连接与物理连接之间的关联在当次调用结束后一定能够解除,避免了连接泄露的出现,而且这种注册和检查完全可以自动实现,不需要应用程序开发者的参与,高效率地解决了连接泄露的问题。
在本发明实施例中,所述用户连接与物理连接的关联解除后,用户连接与物理连接就相互独立了,此时,物理连接可以被放回连接池进行复用;在连接池已满时,可以将该物理连接关闭。
如果客户端后续不需要再进行数据调用,那么此时可以关闭该用户连接;当客户端后续还需要进行数据调用,那么可以将该用户连接保留。因为在本发明实施例中只要解除了用户连接与物理连接的关联即不会对物理连接再有影响,所以此时保留用户连接不会对物理连接造成浪费,反而可以对用户连接进行重用,参见图3,当用户连接在一次连接被保留而再此进程数据调用的过程具体包括:
步骤301:客户端向连接管理器发送连接请求,申请为自身保留的用户连接关联一个物理连接。
步骤302:连接管理器根据所述连接请求为所述用户连接关联一个物理连接。
在本发明实施例中,所述连接管理器从连接池中获取的一个空闲的物理连接与所述用户连接相关联;
或者,所述连接管理器根据所述连接请求重新创建的一个物理连接与所述用户连接相关联。
步骤303:连接管理器根据所述物理连接和所述用户连接创建连接中介。
步骤304:将所述连接中介注册到调用上下文中。
步骤305:客户端使用该用户连接进行数据调用。
步骤306:调用结束后,客户端向用户端发送关闭连接指示。
步骤307:解除本次调用中物理连接与用户连接之间的关联释放所有本次调用使用的连接中介。
步骤308:检查调用上下问文中是否还有本次调用相对应的连接中介,如果有,执行步骤307。
本发明实施例所提供的方法中,因为客户端可能要多次进行数据调用,就对该用户连接进行了保留,所以该用户连接是以前调用中使用过,但是未关闭的。因为该用户连接与之前调用中的物理连接的关联已经解除,所以保留该用户连接并没有产生连接泄露,相反的,还实现了对该用户连接的重用,在避免连接泄露的同时还节约了创建用户连接这样一个过程,更进一步地提高了数据调用的效率。
与方法实施例相对应,本发明实施例还提供用于查找连接池中未释放的连接的装置,参见图4,包括:
标识单元401,用于在物理连接与用户连接的关联建立后,对当前处于使用状态的物理连接进行标识。
其中,所述标识单元401具体包括:
创建子单元:用于为所述物理连接和所述用户连接创建连接中介。
记录子单元,用于将所述创建子单元创建的连接中介进行记录。
检测单元402,用于在调用结束后,检测本次调用中使用的物理连接是否还具有标识单元对所述物理连接进行的标识,如果有,则确定所检测的连接连接为未释放的物理连接。
优选地,所述装置还包括:
第一释放单元403,用于在所述检测单元检测出未被释放的物理连接后,解除所述未释放的物理连接和与其对应的用户连接之间的关联,删除物理连接具有的所述标识。
通过本发明实施例所提供的装置,在数据调用接收前通过对包含物理连接和用户连接之间的关联关系的连接中介进行记录;调用结束后对所述记录进行检测,当发现其中有当次调用相对应的连接中介时就解除其包含的连接关联,从而释放物理连接,有效避免了连接泄露。
优选地,图4所述的装置还包括:
第二释放单元404,用于将被第一释放单元解除关联的物理连接放回连接池或者关闭。
通过第二释放单元就能够使被释放了的物理连接在连接池空闲时被重用。
在其他实施例中,图4所示的装置还包括:
接收单元405,用于接收调用结束后客户端发出的关闭连接指示。
所述第一释放单元403,还用于根据所述接收单元接收的所述关闭连接指示解除所述物理连接和与其对应的用户连接之间的关联,删除物理连接具有的所述标识。
这样,所述装置在避免泄露的基础上完善了解除连接的功能,使得调用结束后可以正常解除物理连接与用户连接的关联;即使客户端忘记关闭,可以通过对记录子单元的检测解除忘记关闭的关联,避免连接泄露的产生。
本发明可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本发明,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。