2011-03-31 53 views
6

在Java项目中,我使用的是ojdbc6罐子甲骨文的getConnection慢

<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)我不知道有多少连接我的数据库让我登录。任何想法,这个属性是在甲骨文?

+1

也许这篇文章[如何检查允许连接到Oracle数据库的最大数量?](http://stackoverflow.com/questions/162255/how-to-check-the-maximum-number-of-allowed-connections-to-an-oracle-database)对你而言很有趣 – lkdg 2011-04-01 05:44:45

回答

7

使用的/ dev /随机的而不是/ dev/urandom的,以与数据库中的ssh连接当时由于Java的....切换到/ dev/urandom的解决了这个问题

+1

值得一提的是,您可以使用JVM参数-Djava.security.egd = file:/ dev /./ urandom来完成此操作。注意额外的'。'在论据中。请参阅http://stackoverflow.com/questions/137212/how-to-solve-performance-problem-with-java-securerandom。 – Ryan 2014-07-09 16:31:16

3

2个问题。

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

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

我之所以提出这些问题是时间延迟可能花费的时间为DB后你清理(因为你可能没有做它的权利)的量,并释放给你一个连接。其中大部分可能只是在它强制释放资源之前超时。

+0

在底部更新了OP – bwawok 2011-03-31 16:42:55

1

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

+0

我一个接一个地运行我的程序。它似乎正在关闭所有的东西,但不完全知道如何知道。 – bwawok 2011-03-31 18:17:46

+0

如果您使用DBCP,则可以在尝试重新获得另一个连接之前打印datasource.getNumActive()(您需要先将它转换为BasicDataSource)。 – Ray 2011-04-01 09:17:01