# 坏链接处理说明
什么是孤儿链接?
当数据库服务重启时,DevOps连接池中可能仍然保持着之前已经建立的连接。然而,由于数据库服务已经重启,这些连接在数据库服务中已被销毁从而无法再被使用。此时,如果DevOps服务尝试使用这些过时的连接来执行数据库操作,将会失败。这些连接就成为了孤儿链接,因为它们虽然在连接池中,但实际上已经无法连接到数据库服务。
孤儿链接会产生什么问题?
孤儿链接会占用连接池的链接数量,不断增加的孤儿链接会逐渐耗尽连接池的资源,从而影响系统的稳定性和性能。
如何产生的孤儿链接?
eg.
1.连接池的配置不当,如最大连接数、最大空闲时间等参数设置不合理,可能导致孤儿链接的产生。
2.当数据库服务重启后,连接池中的连接信息可能已经过时,导致无法再被使用。
3.网络中断或不稳定可能导致应用程序与数据库服务器之间的连接请求或数据交换失败。如果应用程序认为连接已经建立,而实际上数据库服务器没有收到或未能处理这些请求,就会导致孤儿连接的产生。
如何发现DevOps服务中是否存在孤儿链接?
通过访问DevOps平台管理-高级-调试日志-timeout.log日志来查看当前平台存在的孤儿链接数量。
我们该如何处理已存在的孤儿链接?
首先,无论是开发测试环境还是生产环境,当数据库服务重启后,DevOps服务也必须同步重启,此操作可以清空DevOps数据库连接池,这也包括了其中存在的孤儿链接。
我们应该如何避免产生孤儿链接?
根据实际使用环境,提升DevOps服务的最大最小数据库连接数量,并保证DevOps服务端的数据库连接超时时间要久于数据库服务端的连接超时时间,可以修改user-config.xml文件来进行调整。
设计合理的数据库连接重连机制,DevOps默认支持Mysql类型数据库连接的重连逻辑,可以通过修改'com.primeton.devops.common.dao.ConnectionContext'类的'firstBegin()'方法来适配其他类型的数据库服务,当DevOps服务接收到来自数据库服务的关于数据库连接的异常信息时,会分析其中的异常信息是否包含图中圈出的内容,如包含,则执行数据库连接的重新连接逻辑。
DevOps采用c3p0来管理数据库连接,c3p0版本升级至0.9.5.4后,可以适配额外的参数unreturnedConnectionTimeout来优化处理孤儿链接问题,这个参数定义了一个连接被检出后可以保持打开状态的最大时间。如果这个时间设为非零值,那么当连接在应用程序中被使用后,如果在指定的时间内没有被归还到连接池中,连接池会强制关闭这个连接,并在需要时重新创建一个新的连接。
注意: 老版本的eos并不适配此参数的配置,需要对'com.primeton.ext.common.connection.datasource.C3P0DataSourceProvider'类进行重写。
重写方法如图,需在'devops-spec'项目中的'com.primeton.devops.special'构建包中新建'com.primeton.ext.common.connection.datasource'包,并在其中创建'C3P0DataSourceProvider.java'文件,初始内容与原文件保持一致(可以通过工具检索'com.primeton.ext.common.connection.datasource.C3P0DataSourceProvider'类,并通过反编译查看源码信息),通过修改'getDataSource()'方法来对unreturnedConnectionTimeout值进行配置,如图配置了21600秒,代表了6个小时的超时时间。