【问题标题】:Oracle getConnection slowOracle getConnection 慢
【发布时间】:2023-03-04 17:13:01
【问题描述】:

在一个 Java 项目中,我使用的是 ojdbc6 jar

    <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc6</artifactId>
        <version>11.2.0.1.0</version>
        <scope>compile</scope>
    </dependenc>

我第一次运行,dataSource.getConnection() 很快。第二次通常没问题。接下来的几次大约需要 45 秒。之后,需要几分钟。一旦我运行了给定应用程序的第一个连接,我获得的任何新连接都非常非常快。此延迟仅获得给定运行的第一个连接。

是什么让我的第一次连接如此缓慢?

我正在查看 netstat,但在成功运行后没有看到任何连接挂起。尝试了几种不同的连接池(DBCP、C3PO),但都没有成功。通过源码调试,org.springframework.jdbc.datasource.DataSourceUtils这一行延迟100%:

Connection con = dataSource.getConnection();

有什么想法吗?

编辑了解更多详情

1) 我正在使用一个连接池(DBCP 或 C3PO)来保存连接以供将来使用。当我谈到获得新连接时,我的意思是在使用第一个连接时.. 我需要去数据库并获得一个新连接。当然,我可以一次又一次地返回并从连接池中获得相同的连接。但同时获得一秒也很快。

2) 我不知道我的数据库允许我使用多少个连接登录。知道这个属性在 oracle 中的什么位置吗?

【问题讨论】:

标签: java oracle jdbc datasource


【解决方案1】:

是由于 java 使用 /dev/random 而不是 /dev/urandom 与数据库建立 ssh 连接....切换到 /dev/urandom 解决了这个问题

【讨论】:

  • 值得一提的是,您可以使用 JVM 参数 -Djava.security.egd=file:/dev/./urandom 来完成此操作。注意额外的“。”在论据中。见stackoverflow.com/questions/137212/…
【解决方案2】:

您是否超过了连接池中的最大活动连接数并且必须等待您的程序释放旧连接?

【讨论】:

  • 我一个接一个地运行我的程序。它似乎正在正确关闭所有内容,但不完全确定如何知道。
  • 如果你使用DBCP,你可以打印datasource.getNumActive()(你需要先把它转换成BasicDataSource),然后再尝试获取另一个连接。
【解决方案3】:

2 个问题。

首先,在你获得第一个连接后,你在用它做什么?您是否正确关闭它(包括您使用它打开的所有资源,例如 Statement 和 ResultSet)?

其次,您的数据库允许您使用多少个连接来获取您登录时使用的凭据?

我问这些问题的原因是,时间延迟可能是数据库在您清理之后(因为您可能没有做对)并释放连接给您所需的时间。其中大部分可能只是在强制释放资源之前的超时。

【讨论】:

    猜你喜欢
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多