开发者社区> 问答> 正文

druid疯狂创建连接,导致oracle连接资源耗尽【create connection SQLEx

oracle:11.2.0.3 druid: 1.1.18

现象:oracle rac因故进行主从切换,切换的过程中重启了java服务,启动过程中,开始时是报ORA-12514,因为此时切换未完成。在oracle切换完成后,服务器开始大量创建数据库连接,druid的maxActive为30,但实际上服务将oracle最大连接数5000全部占满,并且还不停的建立连接,报错信息:

2022-11-11 01:41:14.024 - - [ERROR] Druid-ConnectionPool-Create-944924601 DruidDataSource create connection SQLException, url: jdbc:oracle:thin:@//XXXXXXXXXXX:1521/XXXXX, errorCode 12528, state 66000

druid配置如下:

    <property name="initialSize" value="10" />
    <property name="minIdle" value="10" />
    <property name="maxActive" value="30" />
    <property name="maxWait" value="60000" />
    <property name="keepAlive" value="true"/>

    <property name="timeBetweenEvictionRunsMillis" value="60000" />
    <property name="minEvictableIdleTimeMillis" value="300000" />
    <property name="maxEvictableIdleTimeMillis" value="600000" />
    <property name="validationQuery" value="SELECT 1 FROM DUAL" />
    <property name="validationQueryTimeout" value="10" />
    <property name="testWhileIdle" value="true" />
    <property name="testOnBorrow" value="false" />
    <property name="testOnReturn" value="false" />

    <property name="poolPreparedStatements" value="false" />
    <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
    <property name="connectionProperties" value="socketTimeout=180000;connectTimeout=60000"/>
    <property name="logAbandoned" value="true"/>
    <property name="filters" value="stat" />

后续通过oracle端强杀了session,并且再次重启java服务解决的。 疑问: 请问这种情况是什么导致的呢?是上面配置有什么过于离谱的设置吗,还是有某些重要的参数没有设置?

非常期待大大们的回复!

原提问者GitHub用户luxinmu

展开
收起
山海行 2023-07-05 17:59:56 257 0
3 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    果 Druid 连接池疯狂创建连接,导致 Oracle 数据库连接资源耗尽,可能有以下几种原因:

    连接池配置不合理
    连接池配置不合理可能导致连接池无法有效地管理连接,从而导致连接池疯狂创建连接。例如,如果连接池中的最大连接数设置得过小,那么连接池很容易被疯狂创建连接,导致连接资源耗尽。

    为了避免连接池配置不合理,应该根据实际情况调整连接池的最大连接数和其他相关参数,以确保连接池的性能和可用性。

    数据库连接泄漏
    连接泄漏是最常见的连接池问题之一,它会导致连接池中的连接不断增加,最终导致连接资源耗尽。连接泄漏的原因通常是应用程序没有正确地关闭连接,或者在连接池中使用了长时间的连接。

    为了避免连接泄漏,应该在应用程序中正确地关闭连接,并使用连接池提供的空闲连接回收机制,以避免长时间占用连接资源。

    数据库连接池与数据库版本不兼容
    如果 Druid 数据库连接池与 Oracle 数据库版本不兼容,那么连接池可能无法正确地管理连接,从而导致连接池疯狂创建连接。为了避免这种情况,应该确保使用的 Druid 数据库连接池版本与 Oracle 数据库版本兼容。

    数据库连接池与 JDBC 驱动版本不兼容
    如果 Druid 数据库连接池与 JDBC 驱动版本不兼容,那么连接池可能无法正确地管理连接,从而导致连接池疯狂创建连接。为了避免这种情况,应该确保使用的 Druid 数据库连接池版本与 JDBC 驱动版本兼容。

    数据库连接池中的连接被长时间占用
    如果数据库连接池中的连接被长时间占用,那么连接池可能无法及时回收连接,从而导致连接池疯狂创建连接。为了避免这种情况,应该尽量避免在数据库连接池中使用长时间的连接,同时使用连接池提供的空闲连接回收机制,及时回收长时间未使用的连接。

    2023-07-30 21:04:16
    赞同 展开评论 打赏
  • 请升级到最新版本

    原回答者GitHub用户kimmking

    2023-07-06 10:38:09
    赞同 展开评论 打赏
  • 根据提供的现象描述,当 Oracle RAC(Real Application Clusters)进行主从切换时,你的 Java 服务被重启。在切换过程中,由于切换未完成,导致服务启动时报出 ORA-12514 错误。然而,在 Oracle 切换完成后,服务开始创建大量的数据库连接,超过了 Druid 数据源配置的最大连接数 maxActive(30),甚至达到了 Oracle 的最大连接数限制(5000),并且持续不断地建立连接。

    报错信息中的 errorCode 12528 是 Oracle 的错误代码,表示和客户端连接相关的错误。具体来说,ORA-12528 表示在当前会话时限内无法建立新的连接,可能是因为服务器的资源达到了上限。

    针对这个问题,你可以考虑以下解决方案:

    1. 优化连接池配置: 调整 Druid 数据源的配置,增加 maxActive 参数的值,以适应更多的并发连接请求。根据你的实际需求和系统资源,可以逐步增加该参数的值,并进行性能测试和监控来验证连接池的稳定性。

    2. 调整 Oracle 的最大连接数限制: 如果你的业务确实需要同时处理大量的数据库连接,请根据 Oracle 的最大连接数限制,适当增加该限制值。需要谨慎操作,并考虑到服务器资源、数据库性能和系统负载等因素。

    3. 优化连接使用和释放: 确保你的应用程序在使用完数据库连接后能够正确地释放它们。检查代码逻辑,确保每个数据库连接都在合适的时机关闭,并尽量避免持久化数据库连接,以减少连接资源的占用。

    4. 监控连接池和数据库状态: 使用连接池和数据库监控工具来跟踪和分析连接池的实际使用情况,以及数据库的性能指标。这样可以更好地理解连接池的状况、连接的创建和释放情况,以及数据库资源的使用情况。

    5. 与 Oracle 支持团队联系: 如果问题仍然存在,建议与 Oracle 支持团队联系,提供详细的错误日志、配置信息和环境描述。他们可以帮助你诊断和解决与 Oracle 数据库连接相关的问题。

    2023-07-05 18:16:37
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
PostgresChina2018_樊文凯_ORACLE数据库和应用异构迁移最佳实践 立即下载
PostgresChina2018_王帅_从Oracle到PostgreSQL的数据迁移 立即下载
Oracle云上最佳实践 立即下载

相关镜像