连接池问题 [ADODB 连接SQL Server 2005 问题]

yuelailiu 2008-01-05 02:16:04
某一个定时导出的EXE程序,自动导出写入一个csv文件,其中导出模块主要代码如下:
Try
System.IO.File.AppendAllText(strExportFileName, "", System.Text.Encoding.Default)
strDataSQLCommand = "SELECT * FROM t"
ObjData = DoSQLCommand(strDataSQLCommand)
If Not (ObjData Is Nothing) Then
If (ObjData.EOF = False) And (ObjData.BOF = False) Then
While (ObjData.EOF = False) And (ObjData.BOF = False)
For 1 To 100
ObjCSVData.Append();
...
Next
ObjCSVData.Append(vbCrLf)

System.IO.File.AppendAllText(strExportFileName, ObjCSVData.ToString(), System.Text.Encoding.Default)
Call ObjOrderData.MoveNext()
...
End While
End If
End If

Catch ex As Exception
...
End Try

Private Function DoSQLCommand(ByVal strSQLCommand As String) As ADODB.Recordset

On Error GoTo OnError

Dim ObjData As New ADODB.Recordset

If IsEmptyString(strSQLCommand) = True Then
Return (Nothing)
End If

If CheckSQLConnection(False) = True Then

If ObjData.State <> ADODB.ObjectStateEnum.adStateClosed Then Call ObjData.Close()
ObjData.ActiveConnection = Nothing

Call ObjSQLConnection.BeginTrans()

Err.Clear()
Call ObjData.Open(strSQLCommand, ObjSQLConnection, CursorTypeEnum.adOpenKeyset)

If Err.Number <> 0 Then
Call ObjSQLConnection.RollbackTrans()
Return (Nothing)
Else
Call ObjSQLConnection.CommitTrans()
Return (ObjData.Clone)
End If

Else
Return (Nothing)
End If

Exit Function

End Function

程序没问题,数据能正常导出,但程序运转一段时间(比如1-2个月)以后,EXE程序会发生写入csv文件失败,关闭exe程序,再次运行也不行,但重新启动机器后,再运行EXE程序即可.

请问这种情况,会有什么样的原因会导致发生?
(不会是文件读写冲突,因为导出文件名是按系统当前时间产生,精确到秒,格式如 filename_YYYYMMDDHHMMSS.csv)
...全文
265 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 元老 2008-01-06
  • 打赏
  • 举报
回复
如果你判断是连接的问题,可以在出故障的时候, 先检查 sql server 中有没有你的程序的连接进程信息(查 sysprocesses 表)

yuelailiu 2008-01-06
  • 打赏
  • 举报
回复
重新启动的是A机器.
yuelailiu 2008-01-06
  • 打赏
  • 举报
回复
您的意思是说,EXE程序产生了死锁,使得再次连接数据库失败?
(其中EXE程序在A机器,DB在B机器)
-狙击手- 2008-01-05
  • 打赏
  • 举报
回复
关注
yuelailiu 2008-01-05
  • 打赏
  • 举报
回复
导出EXE程序有log记录,但抛出的异常是最外层的catch信息,(连接数据库后,到写入csv文件失败)
就算关掉EXE程序,重新启动EXE程序,重试也不行,只有重启后才可以.

个人分析原因:有没有可能是因为第一次连接数据库后,造成连接池出错,连接池的资源一直没有释放,
就算下一次打开EXE程序,重试不行也还是因为资源未释放,只有重启机器后,连接池所有的错误以及资源才释放.
(小弟对连接池原理不是很清楚,请各位大虾指点,谢谢.)
dawugui 2008-01-05
  • 打赏
  • 举报
回复
程序没问题,数据能正常导出,但程序运转一段时间(比如1-2个月)以后,EXE程序会发生写入csv文件失败,关闭exe程序,再次运行也不行,但重新启动机器后,再运行EXE程序即可.

我个人认为:如果是这样,这应该是操作系统的问题.至于是什么问题,那就不好说了.

再说1-2个月才出一次问题,小case啦.
zjcxc 元老 2008-01-05
  • 打赏
  • 举报
回复
On Error GoTo OnError
--------------------------- 改改这句, 出错的时候抛出错误信息, 并且等待一段时间重试
zjcxc 元老 2008-01-05
  • 打赏
  • 举报
回复
没有错误信息?
dobear_0922 2008-01-05
  • 打赏
  • 举报
回复
(不会是文件读写冲突,因为导出文件名是按系统当前时间产生,精确到秒,格式如 filename_YYYYMMDDHHMMSS.csv)

--------------
可以试试精确到毫秒,,,
dobear_0922 2008-01-05
  • 打赏
  • 举报
回复
看看,帮顶
一个使用ADO连接的示例,演示了TADOStoredProc动态参数的使用,带重连机制 =================== unit UnitDemo; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm2 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form2: TForm2; //数据库服务器 gDBServer: String = '127.0.0.1'; //数据库名称 gDBName: String = 'master'; //数据库用户名 gDBUser: String = 'sa'; //密码 gDBPass: String = '2001'; implementation {$R *.dfm} uses ADODB, UnitADOConnectionPool; const CreateSQL = 'create procedure TestMyPool (@type sysname) '#13#10+ 'as'#13#10+ 'select * from sysobjects where xtype=@type'#13#10+ 'return @@rowcount'; DeleteSQL = 'if Exists(select 1 from sysobjects where xtype=N''P'' and name=N''TestMyPool'')'#13#10+ ' drop procedure TestMyPool'; var gPoolMan: TADOConnPoolMan = Nil; procedure TForm2.Button1Click(Sender: TObject); var ADOObject:TADOConnPoolObject; ADOStoredProc:TADOStoredProc; Running :Integer; I: Integer; begin //取得一个存储过程资源(含一数据库有效连接ADOObject := gPoolMan.CreateSP('TestMyPool'); if ADOObject = Nil then //取得资源失败 Exit; try ADOStoredProc := ADOObject.ExecObject as TADOStoredProc; Running := 2;//允许重试(两次)操作,以便在操作失败之后达到重连 while Running>0 do begin Dec(Running); if ADOObject.NeedRefresh then begin//判断是否有重连标志(比如数据库断开等,可能需要进行重连) if Not ADOObject.Reconnect then Exit; ADOObject.NeedRefresh := Not ADOStoredProc.Parameters.Refresh; if ADOObject.NeedRefresh then Exit; end; for I := 1(*Zero is the *Result* Parameter*) to ADOStoredProc.Parameters.Count - 1 do begin //========================= //传递参数 ADOStoredProc.Parameters.Items[I].Value := 'U'; //========================= end; if Running 0 then try //执行存储过程 ADOStoredProc.Open; //执行存储过程成功,退出循环进入后续的数据处理 break; except On E:Exception do begin //执行失败非程序级的异常通常有两种可能: //1.数据库连接断开 //2.自适合的参数传递当中可能存储过程已更新,参与不一致 //设置重连标志 ADOObject.NeedRefresh := True; //=================== //这里记录数据库操作失败日志 //=================== end; end; Exit; end; //========================== //从ADOStoredProc当中读取记录 ShowMessage(IntToStr(ADOStoredProc.Parameters.ParamByName('Result').Value)); //========================== //关闭存储对象的资源 ADOStoredProc.Close; finally //调用结束,释放资源 ADOObject.Free; end; end; procedure TForm2.FormCreate(Sender: TObject); var ADOConn:TADOConnection; begin (****************BEGIN*******************) (*注:仅为测试准备 *) //初始化测试环境 ADOConn := Nil; if Not TADOConnPoolMan.ConnectADO( gDBServer,gDBUser,gDBPass,gDBName,true,ADOConn) then Exit; try ADOConn.Execute(DeleteSQL); ADOConn.Execute(CreateSQL); finally try ADOConn.Close; except end; ADOConn.Free; end; (*****************END********************) //初始化连接 gPoolMan := TADOConnPoolMan.Create(gDBServer,gDBUser,gDBPass,gDBName,true); end; procedure TForm2.FormDestroy(Sender: TObject); var ADOConn:TADOConnection; begin //释放连接 if Assigned(gPoolMan) then gPoolMan.Free; (****************BEGIN*******************) (*注:仅为测试准备 *) //清理测试环境 ADOConn := Nil; if Not TADOConnPoolMan.ConnectADO( gDBServer,gDBUser,gDBPass,gDBName,true,ADOConn) then Exit; try ADOConn.Execute(DeleteSQL); finally try ADOConn.Close; except end; ADOConn.Free; end; (*****************END********************) end; end.
* ezService一直在更新中。请从http://www.ezService.org/download/ezService.exe下载最新版本。 * 根据调查,多数使用者认为原先的价格过高,自2003年9月1日起ezService价格进行重大调整,仅为原来价格的30%! ezService是一个致力于简化分布式计算服务开发的框架。 简要介绍: 1. 使用ezService开发分布式数据库应用,可以大幅度简化应用服务器的开发,无须在建立COM+/SOAP Server应用上花费任何时间,也不需要费心管理数据库事务,只要具备熟练运用SQL的能力,理解SQL参数匹配规则即可写出复杂的分布式应用服务,使得入门级程序员也可以轻松负担服务开发任务。 2. ezService高级服务允许按照类pascal语法规则自由书写脚本,实现复杂业务逻辑,新版本可以支持自Borland Delphi 7导出的大量函数和对象。同时提供了对COM的直接支持,可以通过引用COM组件,与外部系统进行复杂的交互操作。 3. ezService内核为COM+,支持连接(connection pooling)和对象池(object pooling)机制,自动支持分布式事务。 4. ezService使用ADO提供程序连接数据库管理系统,凡是提供良好的OLE-DB驱动的DBMS均可支持(目前已经在SQL Server和Oracle 8/9上通过用户验证)。 5. ezService使用名为ESDL(ezService定义语言)的(类似WSDL)XML发布文档,ESDL可以对外界发布ezService所开发服务的全部功能接口,使得第三方开发者也可以方便的了解服务,快速进行二次开发而无需了解服务细节。 6. 支持SOAP协议,提供一个ISAPI类型的Web Service,一个ASP.NET Web Service,可以直接将服务功能发布到Internet/Intranet,无须额外编程。 7. 未授权的ezService服务具备与授权版本完全相同的功能,仅会在执行时随机锁定3个用户身份验证帐号,其他功能不受影响。 8. 由于使用了COM+/SOAP技术,ezService可以被主流开发工具轻松调用,发行版本附带了可应用于Borland Delphi 7的一组VCL,使开发员可以迅速访问ezService服务。在Visual Studio .NET开发环境中也可以轻松使用类似技术。 其他介绍: ezService主要定位在以下四个方面:简化中小型分布式关系型计算服务开发、规范服务管理、创建完好设计契约、加速服务客户程序开发。集快速服务设计、服务即时发布、安全管理、跨系统协作于一身,是中小型分布式关系型数据库应用开发的一揽子解决方案,适应于快速搭建完备可靠的应用系统。 ezService所开发的应用服务定义,可以被立即登记到服务注册表中,无需任何繁琐设置即可被ezService客户程序以及支持COM+/SOAP的开发工具所访问。 ezServiceWeb Service服务提供者同时也是ezService系统平台的对外集成接口,遵循其WSDL声明,即可在各种外部系统中生成访问其数据的SOAP客户程序,通过完备的XML请求/响应定义,外部系统可以实现对ezService系统的数据读写访问。 新版本的ezService SE更换了脚本引擎,全面支持下列Delphi单元的绝大多数函数和类: - System - SysUtils - Windows - Classes - Types - TypInfo - Variants - VarUtils - DateUtils - DB - ADODB - ADOInt - DBClient - FMTBcd - IniFiles - MaskUtils - Math - Registry - SqlTimSt - StrUtils - SysConst 具备更强大的扩展能力。 更多内容,请访问作者主页:http://www.ezService.org 目前主页新增了论坛系统,欢迎访问留言: http://www.ezService.org/dvbbs
某公司采用代理服务器接入 Internet,网络拓扑结构如图1-1所示。 请填写host1的Internet协议属性参数。 IP地址: (1) ; 子网掩码: (2) ; 默认网关: (3) ; 其中,host1 默认网关为图中接口 (4) 处的 IP地址。 答案: (1)118.165.3.178 (2)255.255.255.192    (3)118.165.3.190 (4)2(或接口2) 若host1要访问Internet,根据默认路由,数据报文经IP地址为 (5) 的接口发送到IP 地址为 (6) 的网关。 答案:(5)118.165.3.178 (6)118.165.3.190 与命令route print作用等价的命令为 (7) 。 A. netstat -r B. ping C. tracert D. arp –a 答案:A 或 netstar -r 接口3的IP地址为 (8) 。 答案:204.116.172.34 某公司要在 Windows 2003 Server 上搭建内部FTP服务器,服务器分配有一个静态 的公网IP地址228.121.12.38。 在Windows 2003中安装FTP服务,需在“应用程序服务器”选项的 (1) 组件 复选框中选择“文件传输协议(FTP)服务”进行安装。 (1)备选答案: A. ASP.NET B. Internet信息服务(IIS) C. 应用程序服务器控制台 D. 启用网络服务 答案:B 或 Internet信息服务 (IIS) 在图2-1中,在“输入此FTP站点使用的 IP地址”文本框中应填入 (2) ,默 认情况下“输入此FTP站点的TCP端口”文本框中应填入 (3) 。 答案:(2)228.121.12.38 (3)21 在图2-2中,如果FTP资源存储在F盘,新建FTP站点的默认主目录为 (4) 。 (4)备选答案: A. F:\inetpub\ftproot B. F:\ftp C. F:\ftp\root D. F:\inetpub\wwwroot 答案:A 或 F:\inetpub\ftproot FTP服务器配置完成后,可以在网络上另一台 PC中测试 FTP是否配置成功。测试 过程为:在该计算机上命令行模式下输入命令 (5) ,在出现 USER提示时输入 FTP 服务器上计算机管理员名称和密码就可以登陆了。如果该 FTP上开启了匿名访问功能, 在用户名处输入 (6) ,密码处填写一个 Email地址也可以登录。 (6)备选答案: A. anonymous B. user C. administrator :(5)ftp 228.121.12.38 (6)A 或 anonymous 依据图2-2的配置,该FTP服务器配置完成后,用户可以上传文件吗?为什么? 答案:不可以。(1分)因为FTP服务器没有赋予“写入”权限。(2分) 该网络中,区域 1 是防火墙的 (1) 。为使该企业网能够接入 Internet,路由器的 接口1可以使用的IP地址是 (2) 。 备选答案: (1)A. DMZ B. Trust区域 C. Untrust区域 (2)A. 10.1.1.1 B. 61.11.52.101 C. 172.30.1.1 D. 192.168.1.1 答案:(1)A 或 DMZ (2)B 或 61.11.52.101 若需要架设一台Web服务器对外提供服务,域名为www.test.com,外网 IP地址为 61.11.52.98,内网IP地址为192.168.1.4,则Web 服务器应该放置在 (3) 。若内网用 户可以通过域名正常访问该Web服务器,而外网用户无法访问该服务器。经检查,Web 服务器的DNS记录配置正确,则可能的原因是 (4) 。 备选答案: (3)A. 区域1 B. 区域2 (4)A. 路由器上NAT表项配置错误 B. DHCP服务器配置错误 C. Web服务器未启动 答案:(3)A 或区域1 (4)A 或 路由器上NAT 表项配置错误 若区域 2 中的计算机接入 Internet 时,网络连接时断时续,网络管理员利用 Sniffer抓包工具分析区域 2 中的分组,发现大量 arp 应答数据包占用了网络带宽,则可能的故障原因是 (5) 。为了排除故障,网络管理员应采取的措施为 (6) 。 (5)备选答案: A. 网络线路出现故障 B. 网络中出现了arp病毒 C. DNS服务器配置错误 D. 防火墙配置错误 答案:(5)B 或网络中出现了arp病毒(2分)   (6)查出受病毒感染的机器,将其从网络中断开(1分) (或区域2中所有的计算机都安装arp防火墙) (7)备选答案: A. Web服务器未启动 B. DNS服务器未启动 C. 客户端机器网络线路故障 D. 客户端机器网卡故障 答案:C 若某客户机使用 IE 可以正常访问网站,而 QQ 软件不能联网,可能的原因是 (8)备选答案: A. DNS服务器配置错误 B. QQ软件代理配置错误 C. 客户端机器网络线路故障 D. 客户端机器网卡故障 答案:B 某公司通过服务器S1中的“路由和远程访问”服务接入Internet,拓扑结构如图4-1 所示。其中,服务器S1 的操作系统为Windows Server 2003,公司从 ISP处租用的公网 IP地址段是202.134.135.88/29。 对服务器S1进行配置时,打开“NAT/基本防火墙”配置窗口,在图 4-2(a) 、(b)、 (c)中,配置lan接口的是 (1) ,配置wan接口的是 (2) 。答案:(1)(a) 或图4-2(a) (2)(b)或 图4-2(b) 为保证内网 PC 可以访问 Internet,图 4-3 所示 wan 接口的地址池中,起始地址为 (3) ,结束地址为 (4) 。 如果内网中 Web 服务器对外提供服务的 IP 地址是 202.134.135.92,则需要在图 4-4 中“保留此公用IP地址”文本框中填入 (5) , “为专用网络上的计算机”文本框中填 入 (6) 。 答案: (3)202.134.135.89 (4)202.134.135.93   (5)202.134.135.92 (6)192.168.1.100 为保证 Web 服务器能正常对外提供服务,还需要在图 4-5 所示的“服务和端口”选 项卡中勾选 (7) 选项。如果要让来自 Internet 的 ping 消息通过 S1,在图 4-6 中至少 要勾选 (8) 选项。 答案: (7)web服务器(HTTP) (8)传入的回应请求 以下是用 ASP 实现的一个网上报名系统。用 IE 打开网页文件“index.asp”后的效果 【index.asp文档的内容】 <% set conn=server.CreateObject("adodb.connection") conn.open"driver={Microsoft Access driver (*.mdb)};dbq="&server.mappath("date/date.mdb") exec="select * from webset" 为程序中空缺处(1)选择正确答案。 备选答案: A. Open B. Run C. Execute D. Dim 答案:A 备选答案: A. Text B. Submit C. Password D. Radio E. Checkbox F. Option G. Select H. Reset 2)A (3)C (4)D (5)G (6)B 该网页连接的数据库类型是 (7) 。 备选答案: A. Oracle B. SQLServer C. Access D. DB2 答案:C HTML文档中的标记的cellpadding属性用于定义 (8) 。 备选答案: A. 内容对齐方式 B. 背景颜色 C. 边线粗细 D. 单元格边距 答案:D

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧