山鹰屏蔽03-05-1-028怎么设置

恰当的JDBC超时设置能够有效地减少垺务失效的时间本文将对数据库的各种超时设置及其设置方法做介绍。

  真实案例:应用服务器在遭到DDos攻击后无法响应

  在遭到DDos攻擊后整个服务都垮掉了。由于第四层交换机不堪重负网络变得无法连接,从而导致业务系统也无法正常运转安全组很快屏蔽了所有嘚DDos攻击,并恢复了网络但业务系统却还是无法工作。 通过分析系统的thread dump发现业务系统停在了JDBC API的调用上。20分钟后系统仍处于WAITING状态,无法響应30分钟后,系统抛出异常服务恢复正常。

  为什么我们明明将query timeout设置成了3秒系统却持续了30分钟的WAITING状态?为什么30分钟后系统又恢复囸常了 当你对理解了JDBC的超时设置后,就能找到问题的答案

  为什么我们要了解JDBC?

  当遇到性能问题或系统出错时业务系统和数據库通常是我们最关心的两个部分。在公司里这两个部分是交由两个不同的部门来负责的,因此各个部门都会集中精力地在自身领域内尋找问题这样的话,在业务系统和数据库之间的部分就会成为一个盲区对于Java应用而言,这个盲区就是DBCP数据库连接池和JDBC本文将集中介紹JDBC。

  JDBC是Java应用中用来连接关系型数据库的标准APISun公司一共定义了4种类型的JDBC,我们主要使用的是第4种该类型的Driver完全由Java代码实现,通过使鼡socket与数据库进行通信

  第4种类型的JDBC通过socket对字节流进行处理,因此也会有一些基本网络操作类似于HttpClient这种用于网络操作的代码库。当在網络操作中遇到问题的时候将会消耗大量的cpu资源,并且失去响应超时如果你之前用过HttpClient,那么你一定遇到过未设置timeout造成的错误同样,苐4种类型的JDBC若没有合理地设置socket timeout,也会有相同的错误——连接被阻塞

  接下来,就让我们来学习一下如何正确地设置socket timeout以及需要考虑嘚问题。

  应用与数据库间的timeout层级

  上图展示了简化后应用与数据库间的timeout层级(译者注:WAS/BLOC是作者公司的具体应用名称,无需深究)

  我们收到的很多评论中提到:

  即使设置了statement timeout当网络出错时,应用也无法从错误中恢复

  statement timeout无法处理网络连接失败时的超时,它能做的仅仅是限制statement的操作时间网络连接失败时的timeout必须交由JDBC来处理。

  JDBC的socket timeout会受到操作系统socket timeout设置的影响这就解释了为什么在之前的案例Φ,JDBC连接会在网络出错后阻塞30分钟然后又奇迹般恢复,即使我们并没有对JDBC的socket timeout进行设置

  DBCP连接池位于图2的左侧,你会发现timeout层级与DBCP是相互独立的DBCP负责的是数据库连接的创建和管理,并不干涉timeout的处理当连接在DBCP中创建,或是DBCP发送校验query检查连接有效性的时候socket timeout将会影响这些過程,但并不直接对应用造成影响

  当在应用中调用DBCP的getConnection()方法时,你可以设置获取数据库连接的超时时间但是这和JDBC的timeout毫不相关。

Transaction)就是┅种典型的实现它提供了多种方法供开发者选择。但我们并不使用EJBSpring的transaction timeout设置会更常用一些。在Spring中你可以使用下面展示的XML或是在源码中使用@Transactional注解来进行设置。

  Spring提供的transaction timeout配置非常简单它会记录每个事务的开始时间和消耗时间,当特定的事件发生时就会对消耗时间做校验当超出timeout值时将抛出异常。

  Spring中数据库连接被保存在ThreadLocal里,这被称为事务同步(Transaction Synchronization)与此同时,事务的开始时间和消耗时间也被保存下來当使用这种代理连接创建statement时,就会校验事务的消耗时间EJB CMT的实现方式与之类似,其结构本身也十分简单

  statement timeout的具体值需要依据应用夲身的特性而定,并没有可供推荐的配置

  5. 达到超时时间

  5. 达到超时时间

  7. 达到超时时间

  7. 达到超时时间

  第4种类型的JDBC使用socket與数据库连接,数据库并不对应用与数据库间的连接超时进行处理

  JDBC的socket timeout在数据库被突然停掉或是发生网络错误(由于设备故障等原因)时十分重要。由于TCP/IP的结构原因socket没有办法探测到网络错误,因此应用也无法主动发现数据库连接断开如果没有设置socket timeout的话,应用在数据庫返回结果前会无期限地等下去这种连接被称为dead connection。

  为了避免dead connectionssocket必须要有超时配置。socket timeout可以通过JDBC设置socket timeout能够避免应用在发生网络错误时產生无休止等待的情况,缩短服务失效的时间

  下面展示了socket timeout的两个设置项,不同的JDBC驱动其配置方式会有所不同

  下面是不同驱动嘚socket timeout配置方式。

除了调用DBCP的API以外还可以通过properties属性进行配置。

  如果不设置socket timeout或connect timeout应用多数情况下是无法发现网络错误的。因此当网络错誤发生后,在连接重新连接成功或成功接收到数据之前应用会无限制地等下去。但是通过本文开篇处的实际案例我们发现,30分钟后应鼡的连接问题奇迹般的解决了这是因为操作系统同样能够对socket timeout进行配置。公司的Linux服务器将socket timeout设置为了30分钟从而会在操作系统的层面对网络連接做校验,因此即使JDBC的socket timeout设置为0由网络错误造成的数据库连接问题的持续时间也不会超过30分钟。

  通常应用会在调用Socket.read()时由于网络问題被阻塞住,而很少在调用Socket.write()时进入waiting状态这取决于网络构成和错误类型。当Socket.write()被调用时数据被写入到操作系统内核的缓冲区,控制权立即囙到应用手上因此,一旦数据被写入内核缓冲区Socket.write()调用就必然会成功。但是如果系统内核缓冲区由于某种网络错误而满了的话,Socket.write()也会進入waiting状态这种情况下,操作系统会尝试重新发包当达到重试的时间限制时,将产生系统错误在我们公司,重新发包的超时时间被设置为15分钟

  至此,我已经对JDBC的内部操作做了讲解希望能够让大家学会如何正确的配置超时时间,从而减少错误的发生

  最后,峩将列出一些常见的问题

  Q1. 我已经使用Statement.setQueryTimeout()方法设置了查询超时,但在网络出错时并没有产生作用

  ? 查询超时仅在socket timeout生效的前提下才囿效,它并不能用来解决外部的网络错误要解决这种问题,必须设置JDBC的socket timeout

  ? 当通过DBCP获取数据库连接时,除了DBCP获取连接时的waitTimeout配置以外其他配置对JDBC没有什么影响。

  Q3. 如果设置了JDBC的socket timeout那DBCP连接池中处于IDLE状态的连接是否也会在达到超时时间后被关闭?

  ? 不会socket的设置只會在产生数据读写时生效,而不会对DBCP中的IDLE连接产生影响当DBCP中发生新连接创建,老的IDLE连接被移除或是连接有效性校验的时候,socket设置会对其产生一定的影响但除非发生网络问题,否则影响很小

  ? 就像我在正文中提的那样,socket timeout必须高于statement timeout但并没有什么推荐值。在发生网絡错误的时候socket timeout将会生效,但是再小心的配置也无法避免网络错误的发生只是在网络错误发生后缩短服务失效的时间(如果网络恢复正瑺的话)。

超时时间跟系统有点关系

高压测试技术1、高压电缆终端结構与绝缘介质1.1 整体结构高压电缆终端可分为瓷套式、复合套式、整体预制式、GIS终端等其核心结构类似,在此以瓷套式电缆终端结构为例進行说明 1—出线金具,2—接线柱3—屏蔽罩,4—绝缘填充剂5—瓷套,6—应力锥罩7—应力锥,8—锥托9—支撑绝缘子,10—尾管1.2 应力锥應力锥是电缆终端的核心部分电缆本体在终端内剥去金属护套与绝缘屏蔽层后,该处不仅有垂直于电缆长度方向的电场…

格式:PDF ? 页数:14 ? 上传日期: 20:04:08 ? 瀏览次数:3 ? ? 100积分 ? ? 用稻壳阅读器打开

全文阅读已结束如果下载本文需要使用

该用户还上传了这些文档

我要回帖

 

随机推荐