连接池与不稳定网络

        连接池技术,大大的提升了应用程序的性能,但是如果不了解连接池的使用场景和原理,就茫然使用连接池,.net默认使用连接池,大多数人会选择使用连接池的默认设置,这样带来的后果往往也是惨痛的,也许你将花费更大的代价去查找因为连接池的不当使用而带来的未知问题。

         在一个项目中,因为连接池的不当使用而带来了一个惨痛的教训。一般我们的应用程序如果部署在一个较为稳定的网络环境中,默认使用连接池可能不会有什么问题,如果一旦部署到一个不稳定的网络环境,你就必须得绞尽脑汁去面对那些应用不稳定代带来的折磨。

        首先,大概说一下连接池的原理

       

        数据库连接池允许应用程序重用已存在于池中的数据库连接,以避免反复的建立新的数据库连接。这种技术能有效提高应用程序的伸缩性,因为有限的数据库连接能够给大量的客户提供服务。这种技术同时也提高的系统性能,避免了大量建立新连接的开销。

  开发一个具有伸缩性的、高性能应用程序应该最大限度的减少建立连接所花费的时间,保持数据库连接最大限度的有效,以存取数据。当一个数据库连接关闭时,它只是由连接池收回以待重用,并未真正释放。但是,如果连接池被释放,数据库连接将会被释放掉。

  开发人员应当注意不要依赖垃圾回收机制去释放数据库连接,因为当参数超出作用域时,数据库连接并没有得必要的关闭,这种数据库资源泄漏将导致建立新连接时抛出连接错误。

  建立数据库连接池

  当打开一个数据库连接时,一个数据库连接池也就创建了。数据库连接池的创建与数据库连接字符串精确的相关(包括空格、大小写)。所有的连接池是根据连接字符串来区分的。在创建一个新的数据库连接时,如果连接字符串不完全相同,将创建不同的连接池。

  一旦数据库连接池被创建,它将一直存在直到该进程结束。维护一个非活动状态的连接池几乎不需要什么系统开销。

  连接池中的数据库连接
  
  连接池根据唯一的连接字符串被创建。在连接池被创建的同时,连接池将创建最小的数据库连接,当连接不够用时,连接池将逐个添加数据库连接直到达到最大连接数,此后的连接请求将被加入请求队列里。当调用数据库连接对象的Close方法或Dispose方法时,数据库连接将被数据库连接池回收。

  当数据库连接使用完成后,要调用Close方法或Dispose方法将它返回连接池。没有显式释放的数据库连接可能会没有返回连接池。

      应用程序在建立连接时,如果启用连接池,会在连接池维护一个逻辑连接和一个物理连接。

      在不稳定网络环境中,如防火墙,网闸(内外网部署应用)物理隔离,在级联交换机出现在网络阻塞的情况下出现网络瞬断的概率较大

       内外网系统交互,出现网络瞬断时,再建立网路连接就很容易出现ora-03113 通信通道的文件结束或ora-03114无法连接到oracle,这两个错误在网上的解释大部分都是因为网络导致。那么针对这两种错误,如果没有必要使用连接池就设置连接字符串Pooling=false,因为在使用连接池时,一旦出现网络瞬断,连接池里的连接物理连接已经中断,但逻辑连接依然存在,当下次有新的请求时,连接池就很有可能将死连接分配出去,就会出现上面的错误。如果出现ora-03114只能重新连接。
       

        以下之前解决这个问题时的步骤,之前写的一个总结,但是最终依然没有根治,最终不使用连接池不再出现错误,

      短信中心服务开发完成后,在测试经常发现一个oracle错误:ORA-03113,而且只要一发生这个错误,短信服务就不能正常提供服务。发生的这个错误还是很有规律的,就是在业务繁忙时是不会发生这个错误的,只有在服务长时间空闲时才发生(一般是超过5分钟没有操作的情况下)。开始以为是oracle会自动切断不活动的连接,但是查看oraclesession日志后,发现oracle并没有主动切断数据库连接,而且这个数据库连接是“莫名其妙”的断开的,也即不是客户端断开的(由于程序中使用了数据库连接池,连接池会每隔一定时间将不活动的连接关闭)。然后为了查看到底是什么问题,我们就在数据库端和客户端同时监视连接的情况(在数据库端监视数据库连接,在客户端监视TCP连接数,oracle使用的1521端口通信)。这时候发现了一个有趣的问题:就是当出现ORA-03113错误时,数据库端的session显示的连接很好,但是在客户端就会发现大量的僵死的TCP连接(连接未完全关闭,状态显示是CLOSING)。这时我们就猜测可能是中间的网络环境导致TCP连接非正常关闭。咨询了“网管”后,得知应用服务器和数据库服务器之间要通过网闸,但是网管说网闸不会切断连接的。经过查询资料后(请看这一篇文章:http://www.laoxiong.net/oracle_and_firewall.html),发现我们的情况和文章上的很相似,我们就怀疑网关有TCP连接拆除功能(这个需要在落实下,摸清网闸的功能和网闸到底能对网络产生多大的影响)。经过一番测试后,最中定位到网闸应该有定时拆除TCP连接的功能(因为如果业务比较频繁的话,数据库连接是畅通的,只要在业务空闲的情况下才会出现这个问题)。

问题解决思路:

第一步:我们打算先从连接池配置开始,这些僵死连接对连接池最大的影响就是使连接池认为这些连接还是畅通的,当程序打开一个连接时,连接池就会返回一个僵死连接,这时候在僵死连接上操作就会发生ORA-03113错误。我们的思路就是将连接池关闭连接的时间缩短。尽量市空闲连接在僵死前将其关闭然后重新建立连接(注意:这样会使连接池性能有所下降)。但是经测试,这个方法的效果并不是很好,因为连接僵死的时间并不固定,所以无法设置一个合适的时间让连接池关闭连接。

第二部:使用oracle DCD功能,也就是设置sqlnet.orasqlnet.expire_time参数,让oracle定期发送心跳包使连接保活,但是这个方法还是有一个问题的,就是应用的心跳包会超时(TCPkeepalive属性导致)。所以为了使oracle和客户端尽早发现连接断开,需要设置TCPkeepalive参数(Windows需要设置注册表,LINUX需要设置相应的配置文件),这样可以解决短连接问题(这里的短连接指程序使用的短连接,也就是在需要使用数据库时才申请连接,快速完成事务,然后关闭连接,由于使用了连接池,所以连接并没有关闭,只是归还到连接池而已)。

第三部:短连接问题解决了,但是长连接还是照样会出现ORA-03113错误(使用长连接的是oracle AQ轮询线程,该线程会不停对AQ队列进行一次出队操作,超时时间是5m,以此来从队列里获得短信数据)。经试验检测是因为在等待的这段时间内,数据库连接断开所导致。所以我们就将出队操作的时间缩短到1m,这样就是该连接一直有活动,这样就使ora-03113的错误发生概率降到了最低。

最终的解决方案:

1.       使用oracle DCD国内(设置sqlnet.expire_time参数),设置操作系统的keepalive参数。

2.       针对短连接和长连接分别采用不同的数据库连接池策略,短连接使用数据库连接池,并设置连接保活时间,这样可以是连接池尽可能早的发现僵死连接。对于常连接,则不使用数据库连接池,一旦发生ORA-03113错误,说明此连接已经失效,这时就关闭此连接,并申请新的连接。

3.       缩短oracle AQ的出队等待时间,这样可以是连接经常有操作。但是这样又出现了第二个问题ORA-25228错误(队列出队超时)。随意最后队列的异常处理为:ORA-03113 关闭连接,重新申请连接,ORA-25228 不进行任何操作,直接进行下一次的出队操作。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
网络在线考试系统的数据库设计 为了建立一个新型的、安全可靠的网络在线考试系统,数据的安全性和完整性应有较 高的要求。该文介绍了在线考试系统数据库的概念设计、物理结构设计、逻辑结构、数 据库连接池技术,对于在线考试系统的数据库设计有一定的参考价值。 标签:在线考试系统SQL Server 2000数据库连接池技术 众所周知,当今社会各种领域与计算机互联网技术越来越密切相关,计算机信息技术 的快速发展正在改变着世界。随着计算机网络网络应用软件的日益普及,现代化教育 蓬勃发展,建立一个新型的、安全可靠的在线考试系统已成为可能。 1 数据库开发工具的选取 由于网络在线考试系统对于数据的安全性及完整性要求比较高,并且为了增加程序的 适用范围,还要保证系统可以拥有存储足够多的数据能力。因此需要选择一种可靠、安 全和易用的数据库开发工具,SQL Server 2000作为一种高性能的关系型数据库管理系统,有着较好的可靠性、安全性和易用性。 SQL server 2000是Microsoft公司在2000年推出的,它继承了SQL Server 7.0版本的优点同时又比它增加了许多更先进的功能,具有使用方便,可伸缩性好与相关 软件集成程度高等优点,共有4个版本,分别是个人版,标准版,企业版和开发版。 SQL server 2000的特点: Internet集成。 可伸缩性和可用性。 企业级数据库功能。 易于安装、 部署和使用。 2 数据库设计 2.1 数据库概念设计 2.1.1 考生档案实体 考生档案实体包括编号、姓名、密码、性别、专业、班级、提示问题、问题答案、注册 时间、身份证号属性。 2.1.2 教师档案实体 教师档案实体包括编号、姓名、密码、性别、所属院系、注册时间、联系电话属性。 2.1.3 管理员档案实体 教师档案实体包括编号、姓名、密码。 2.1.4 套题实体 套题实体包括编号、套题名称、所属课程和添加时间属性。 2.1.5 考试题目实体 考试题目实体包括编号、问题类型、所属课程、所属套题、选项A、选项B、选项C、选项 D、添加时间、正确答案和备注属性。 2.1.6 考生成绩信息实体 考生成绩信息实体包括编号、准考证号、所属课程、单选题分数和多选题分数、合计分 数、添加时间属性。 2.1.7 课程信息实体 课程信息实体包括编号、课程名称、添加时间属性。 2.2 数据库物理结构设计 设计原则如下: 2.2.1 进行规范化设计,尽量地减少数据的冗余和重复 2.2.2结构设计与操作设计相结合 2.2.3 数据结构具有相对稳定性数据结构的相对稳定性,可以作为新、旧系统转换的依据。 2.3 数据库逻辑结构 数据库的逻辑设计就是将数据的概念设计转化为数据库系统的实际模型,从而得到数据 库的逻辑结构,根据数据库概念设计,就可以创建与之相对应的数据表。 本系统包括以下几个主要的數据库表: 2.3.1 student表(考生信息表):考生信息表用来保存考生信息。 2.3.2 manager表(管理员信息表):管理员信息表用来存放管理员信息。 2.3.3 Teacher表(教师信息表):教师信息表用来存放教师的基本信息。 2.3.4 Taoti表(套题信息表):套题信息表用来保存套题信息。 2.3.5 Questions表(考试题目信息表):考试题目信息表用来保存考试题目信息,该表中保存 着所属课程和所属套题的ID,通过这两个ID可以获取所属课程和套题的信息。 2.3.6 stuResult表(考生成绩信息表):考生成绩信息表用来保存考生成绩,该表的所属课程 字段whichLesson与Lesson表中的name字段相关联,并且设置为级联更新。 2.3.7 Lesson表(课程信息表):课程信息表用来保存课程信息。 2.4 数据库连接池技术 通常在每次访问数据库之前都要先建立与数据库的连接,这件消耗一定的资源,并延长 可访问数据库的时间,如果是一个访问量很高的系统,将严重影响该系统的性能。解决 这个问题可以引入连接池技术。 2.4.1 数据库连接池的具体实施方法如下: 预先创建一定数量的连接,存放在连接池中。 当程序请求一个连接时,不需重新建立一个新连接,连接池会为该请求分配一个空 闲的连接;当程序使用完连接后,该连接将会重新回到连接池中,而不是直接将连接释 放。 当连接池中的空闲连接数量低于下限时,连接池将根据管理机制追加创建一定数量 的连接;当空闲连接数量高于上限时,连接池将释放一定数量的连接。 2.4.2 数据库连接池技术的优点: 资源重用。 更快的系统响应速度。 新的资源分配手段。 2.4.3 统一的连接管理,避免数据库连接泄漏 2.5 数据库的安全和加密 数据库系统的安全除了依赖自身内部的安全机制外,还与外部网络环境、应用环境、从 业人员
本设计分享的是不断电之太阳能板/锂电池可选充电器设计,并附上原理图/PCB源文件,方便网友二次开发。该太阳能板/锂电池可选充电器支持5V供电,将该板连接到传感器板上,就可以永远运行太阳能发电!如果太阳能板发电不足,可通过microUSB端口锂电池对其进行充电。太阳能板/锂电池可选充电器实物连接图: 不断电之太阳能板/锂电池可选充电器硬件设计框图: 不断电之太阳能板/锂电池可选充电器特点: Jst 2.0连接器 稳定的5V USB电源,无论源 充电/充电算法内置于芯片中 通过太阳能或USB充电锂聚合物电池 稳定的电源电压通过锂电池或USB 2个USB端口让您可以在为锂电池充电时对套件进行编程 LED指示灯充满电或充电状态 简单的设计意味着实惠 通过简单的最终用户修改可扩展到多个锂电池和大型/多个太阳能电池板 故障分析: 太阳能板 太阳能电池板通过下部JST连接器连接到电路板。请注意,太阳能充电器IC只接受4.8-6.0V范围内的输入电压。如果充电指示灯不亮,可能是由于: 充电锂电池 太阳能电池板电压超出范围(很可能是由于太阳能发电不足)。 在第二种情况下,如果可能,重新安置太阳能电池板以接受更多的阳光。上述条件都不会阻止该充电器向USB提供稳定的5V电源,除非电池是平坦的。 锂电池 如果要使用锂聚合物。然而,锂聚合物和锂离子电池的化学性能相当于可互换使用的两种电池类型。如果要使用多个电池,则并联而不是串联连接,因为充电器IC提供4.2V。 应用思路: 绿色电力和备用电源用于分布式室外传感器网络 锂电池充电器

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值