2011-03-31 102 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