2009-10-08 21 views
2

使用Spring 1.2.1和oracle.jdbc.pool.OracleDataSource 10.2.0.3.0我有時會得到如下的堆棧跟蹤。我認爲這是由於連接池已滿而引起的。有誰知道原因肯定嗎?同樣,新版本的Spring或Oracle JDBC可以更好地處理這個問題嗎?在創建預準備語句時,什麼原因導致Spring 1.2 NullPointerException?

java.lang.NullPointerException 
    at org.springframework.jdbc.core.PreparedStatementCreatorFactory$PreparedStatementCreatorImpl.createPreparedStatement(PreparedStatementCreatorFactory.java:213) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:444) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:491) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:522) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:543) 
    at org.springframework.jdbc.object.SqlQuery.execute(SqlQuery.java:114) 
    at org.springframework.jdbc.object.SqlQuery.execute(SqlQuery.java:124) 
    at sps.wfds.biz.glacier.MemberDAO.create(MemberDAO.java:44) 
    at sps.wfds.biz.glacier.MemberDAO.create(MemberDAO.java:23) 
    at sps.wfds.biz.glacier.AbstractDAO.createAndValidate(AbstractDAO.java:22) 
    at sps.wfds.web.interceptor.AbstractPrincipal.init(AbstractPrincipal.java:87) 
    at sps.wfds.web.interceptor.AbstractPrincipal.getAttributes(AbstractPrincipal.java:66) 
    at sps.wfds.web.interceptor.AbstractPrincipal.getAttribute(AbstractPrincipal.java:60) 
    at sps.wfds.web.interceptor.AbstractPrincipal.setLocale(AbstractPrincipal.java:38) 
    at sps.wfds.web.util.LocaleUtil.setLocale(LocaleUtil.java:24) 
    at sps.wfds.web.interceptor.SSOPrincipal.(SSOPrincipal.java:22) 
    at sps.wfds.web.interceptor.SSOAuthority.getPrincipal(SSOAuthority.java:18) 
    at sps.wfds.web.interceptor.Authorization.preHandle(Authorization.java:44) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:674) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:625) 
    at org.springframework.web.servlet.FrameworkServlet.serviceWrapper(FrameworkServlet.java:386) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:346) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:689) 
+0

我已經更新了我的答案 - 請看看 – ChssPly76 2009-10-12 15:37:30

回答

3

這與Spring沒有任何關係。

DataSource.getConnection()不應該返回null;它應該返回一個有效的連接或拋出一個SQLException。錯誤是由oracle.jdbc.pool.OracleDataSource行爲不當造成的。

更新

根據Oracke documentation發生這種情況時:

  • 連接已經在池中被分配的最大數量;
  • ConnectionWaitTimeout已設置爲非零值
  • 您一直在等待getConnection(),並且沒有連接返回到池。
考慮到這一點

所以,你可以:

  1. 檢查您的代碼,以確保沒有連接處泄漏
  2. 增加您的池大小
  3. 提高連接等待超時
  4. 使用一個不同的池:-)或者圍繞OracleDataSource編寫一個簡單的包裝器,它將檢查返回的'null',而不是拋出一個SqlException。

在最後一種情況下,您只會爲另一個例外(NPE - > SqlException)交易一個例外。當然,它會更合適,但它並不真正解決問題。

+0

謝謝你提供的原因 - 你能幫助解決這個問題嗎? – 2009-10-12 14:52:53

0
public PreparedStatement createPreparedStatement(Connection con) throws SQLException { 

正如你所看到的簽名需要一個像ChssPly76說的連接對象,並且找不到它。

+0

根據簽名,如何判斷NullPointerException是由方法參數而不是方法中的其他內容引起的? – 2009-10-12 14:53:45

相關問題