2010-02-12 111 views
3

使用Spring Framework時,我們是否需要顯式管理數據庫資源?喜歡關閉所有打開的連接等?Spring中的數據庫連接管理

我已閱讀,減輕春季從這些鍋爐板代碼開發者...

這是回答我在Spring Web應用程序正在一個錯誤:

org.springframework.jdbc .CannotGetJdbcConnectionException: 無法獲取JDBC連接;嵌套0​​例外是java.sql.SQLException中: ORA-00020:(150)的過程 最大數目超過

jdbcTemplate在XML文件被配置和DAO實現具有參照該jdbcTemplate豆這是用於查詢數據庫。

+0

看看這個線程回答你的問題,以及 - http://stackoverflow.com/questions/28468350/oracle-data-source-connection-pooling-not-working-used-with-spring-and- jdbctempl/28588982#28588982 – spiderman 2015-02-18 16:55:53

回答

0

這可能是由於連接未關閉。春天你如何訪問你的連接?你在使用JdbcTemplate來查詢數據庫嗎?或者只是從春季獲得連接?

+0

是我使用的JdbcTemplate來查詢數據庫.. – ria 2010-02-12 06:26:08

+0

我已經editted的問題.. – ria 2010-02-12 06:36:18

2

我們是否必須在使用Spring Framework時顯式管理數據庫資源,如關閉所有打開的連接等?

如果您使用的是像JbdcTemplate這樣的Spring抽象,那麼Spring會爲您處理這個問題,並且該部分中存在錯誤的可能性極小。現在,沒有關於你的配置(你的applicationContext.xml),關於上下文的更多信息(你如何創建你的應用程序上下文,這是什麼時候發生的?),這是一件很難說的話。所以這是一個黑暗中的鏡頭:你的數據源配置是否有屬性destroy-method="close"?類似的東西:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 

在某些情況下,不使用銷燬方法與其他一些不良做法相結合最終可能會耗盡資源。

0

我已閱讀,減輕春季從這些鍋爐板 開發商編碼

這取決於你在運行哪個級別的彈簧。 JdbcTemplate提供了許多不同的操作,其中一些操作是即發即棄,其中一些操作仍然需要您正確管理JDBC資源(連接,結果集,語句等)。經驗法則是,如果您發現自己撥打getConnection(),那麼在某些時候您還需要撥打releaseConnection()

ORA-00020:進程 最大數量(150)超過

使用連接池嗎?如果是這樣,那麼請確保它沒有配置大於數據庫能夠處理的最大連接數(在本例中爲150)。如果你沒有使用連接池,那麼你真的,應該是。

0

你說「jdbcTemplate配置在xml文件中」。通常應該爲每個用法創建一個jdbcTemplate的新實例,而不是由Spring管理。

我猜想,每當你從spring請求一個新的jdbcTemplate bean時,它都會創建一個新的連接到數據庫的新連接,但是當它在代碼中超出範圍後,它仍然會被spring的applicationContext ,因此不會關閉連接。

+0

的連接在查詢結束時關閉/執行/更新。否則,它必須擁有自己的密切方法,這種方法會擊敗它的一些目標。因此,將它作爲Spring Bean應該是完全正確的 – 2018-02-05 14:34:52

0

我的軟管只提供20個連接。我通過手動關閉每個請求到數據庫的連接完成。我沒有在bean中聲明一個destory-method(這不起作用「我不知道爲什麼」),但是我在每次請求調用中都完成了。 (提示:在dao類中擴展JdbcDaoSupport)。

public void cleanUp() { 
     try { 
      if (!this.getJdbcTemplate().getDataSource().getConnection().isClosed()) { 
       this.getJdbcTemplate().getDataSource().getConnection().close(); 
      } 
     } catch (Exception e) { 
      Logger.getLogger(myDAOImpl.class.getName()).log(Level.SEVERE, null, e); 
     } 
    } 
+0

我提到了destroy方法對我不起作用的是我的daoclass而不是** datasource – 2013-01-24 03:51:51