2010-12-06 91 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>