2010-12-06 94 views
5

我使用的是與Hibernate連接池的數據源空指針在休眠開始交易

<bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource" destroy-method="close"> 
      <property name="connectionCachingEnabled" value="true" /> 
     <property name="URL"> 
      <value>${jdbc.url}</value> 
     </property> 
     <property name="user"> 
      <value>${jdbc.username}</value> 
     </property> 
     <property name="password"> 
      <value>${jdbc.password}</value> 
     </property> 
     <property name="connectionCacheProperties"> 
      <value> 
      MinLimit:10 
      MaxLimit:75 
      InitialLimit:10 
      ConnectionWaitTimeout:120 
      InactivityTimeout:180 
      ValidateConnection:true 
      MaxStatementsLimit:0 
      </value> 
     </property> 
    </bean> 



<bean id="hibernatePropertyConfigurer" 
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="location" value="hibernate.properties"/> 
</bean> 

<!-- Database Property --> 
<bean id="hibernatePropertiesPearl" 
     class="org.springframework.beans.factory.config.PropertiesFactoryBean"> 
    <property name="properties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop> 
      <prop key="hibernate.cache.provider_class">MyCacheProvider</prop> 
      <prop key="hibernate.show_sql">false</prop> 
      <prop key="hibernate.max_fetch_depth">0</prop> 
      <prop key="hibernate.jdbc.batch_size">0</prop> 
      <prop key="hibernate.cache.use_query_cache">true</prop> 
      <prop key="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory 
      </prop> 
      <prop key="hibernate.connection.autocommit">false</prop> 
      <prop key="hibernate.transaction.manager_lookup_class"> 
       org.hibernate.transaction.JBossTransactionManagerLookup 
      </prop> 
      <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop> 
      <prop key="hibernate.transaction.auto_close_session">false</prop> 
     </props> 
    </property> 
</bean> 

我所看到的,在連接數據庫成功打開,它的工作好,但一段時間後,我在日誌中收到以下錯誤消息,服務器剛剛死亡:

21:48:20,700 ERROR [RentalAgreementServlet] Generic exception occurred 
java.lang.NullPointerException 
    at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:85) 
    at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1354) 
    at HibernateUtil.currentSession(HibernateUtil.java:116) 

數據庫中的連接數似乎沒有問題。最大值爲75,但實際上永遠不會超過20. 在JBOSS 4.2中部署的應用程序。當空指針執行發生時,內存似乎也可以。 我覺得有些東西在泄漏,但我不知道是什麼。有可能,連接池認爲它有75個會話並試圖增加 - 同時db服務器只有20個連接?

我無法在開發環境中複製它。我試圖殺死/斷開會話,打破網絡連接。我有不同的例外,但沒有nullpointerexception。 任何人都可以給我一個提示什麼來調查什麼專注於?

+0

@BorisPavlović - 我想你的評論讓你的評論毫無意義? :) – willcodejavaforfood 2010-12-06 16:31:51

+0

鮑里斯 - 即使他刪除了參考文獻,您在評論中重複了公司名稱! – CodeClimber 2010-12-06 16:32:49

回答

1

的問題是,有在會議閉幕不是在finally塊的代碼的一部分。如果程序拋出休眠錯誤,則會話保持打開狀態。

2

看起來您在JTA環境中使用的是org.hibernate.transaction.JDBCTransactionFactory

也許你需要org.hibernate.transaction.JTATransactionFactory

<prop key="hibernate.transaction.factory_class"> 
    org.hibernate.transaction.JTATransactionFactory 
</prop>