Oracle getConnection运行缓慢

时间:2011-03-31 16:21:54

标签: java oracle jdbc datasource

在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秒。之后,需要几分钟。一旦我有一个给定应用程序运行的FIRST连接,我得到的任何新连接都非常快。此延迟仅为给定运行获取FIRST连接。

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

我正在观看netstat,并且在成功运行后看不到任何连接。尝试了几个不同的连接池( DBCP,C3PO ),没有运气。通过源代码进行调试,延迟是 org.springframework.jdbc.datasource.DataSourceUtils 行的100%:

Connection con = dataSource.getConnection();

有什么想法吗?

修改详情

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

2)我不知道我的DB允许我登录多少个连接。知道这个属性在oracle中的位置吗?

3 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:3)

2个问题。

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

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

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

答案 2 :(得分:1)

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