to kissoflife(明月高楼休独倚,酒入愁肠,化作相思泪!) :
我不知道网上哪里有这方面的知识,这只是原先我所作过的几个项目中的一些思路,因为我们当时所作的项目由多个大的模块组成,每个模块我们采用了一个独立的ActiveX控件去编写,主程序在根据登录用户的权限去动态加载相应的模块。在这种需求下,我们需要为所有的模块提供统一的数据库连接,所以有了这么一个缓冲池的概念。
实际的制作当中,因为几次都受到时间和难度的影响,所以最终一直没有完成,基本思路是建立一个基于collection的类,以collection去保存每一个建立connection,当有新的请求的时候,我们去这个collection中查找有没有已经存在的connection,如果有则直接使用他。之所以用一个collection来保存connection,主要原因当初考虑各个模块可能会和多钟数据源打交道,所以,最终在collection中所保存的各个connection实际上是和需要连接的数据源是1对1的关系。但是,在这个思路当中并没有考虑多线程并发的情况和trascation事务的情况,只适合与单线程的情况。如果有多线程,并且有可能使用trascation事务处理的话,这种模式是不行,需要对哪些需要使用transcation的线程单独打开一个connection。
连接用同一个,不过我会在每个窗体模块启动的时候调用这样一个函数,用来检测连接是否被中断,因为网络一旦中断相应的连接对象也会被关闭。
'****************************************************************
'//恢复对数据库的连接,在每个用到cnnfiles的窗口的load事件中调用
'****************************************************************
Public Sub ResumeCnnFiles()
Err.Clear
On Error Resume Next
rsTest.Requery
If Err.Number <> 0 Then
On Error GoTo errPro
cnnFiles.Open strCnnFiles
End If
Exit Sub
errPro:
MsgBox "无法连接到数据库服务器,请检测网络状态!", vbExclamation, "无法连接"
End
End Sub