afeigoo 2008-12-17 16:19
浏览 394
已采纳

Jboss 下 Hibernate 的连接错误

spring+hibernate的工程从tomcat5.5移植到JBoss4.2.2。

    spring  2.5.4

    hibernate 3.2

在tomcat下均正常。但是在JBoss下执行如下查询的时候出现错误:

 

 

   private final static SessionFactory sessionFactory;

   private static final ThreadLocal threadSession = new ThreadLocal();

   private static final ThreadLocal threadTransaction = new ThreadLocal();
   
   
   public static void beginTransaction() throws DaoException {
      Transaction tx = (Transaction) threadTransaction.get();
      try {
         if (tx == null) {
            tx = getSession(true).beginTransaction();
            threadTransaction.set(tx);
         }
      } catch (HibernateException ex) {
         log.error("Fail to begin transaction", ex);
         throw new DaoException("Fail to begin transaction", ex);
      }
   }
    

   public static Session getSession(boolean openSession) throws DaoException {
      Session s = (Session) threadSession.get();         
      //if (openSession) {            // 2008-12-17
      if ((openSession)&&(s==null)) {
          
         try {
            if (s == null) {
               s = sessionFactory.openSession();
               threadSession.set(s);
            }
         } catch (HibernateException ex) {
            log.error("Fail to open session", ex);
            throw new DaoException("Fail to open session", ex);
         }
      }
      return s;
   }
   
    public List findByCriterions(Class clazz, List restrictions)
      throws DaoException {
      List objs = new ArrayList();
      
      try {
         Session session = this.openSession();
         beginTransaction();
         Criteria criteria = session.createCriteria(clazz);
         Iterator it = restrictions.iterator();
         while (it.hasNext())
            criteria.add((Criterion) it.next());
         objs = criteria.list();
         if (autoCommit)
            commitTransaction();
      } catch (HibernateException ex) {
         rollbackTransaction();
         log.error("Fail to find objects by criterions", ex);
         throw new DaoException("Fail to find objects by criterions", ex);
      } finally {
         if (autoCloseSession)
            closeSession();
      }
      return objs;
   }
   
   
   

 tx = getSession(true).beginTransaction();出错!!!!

 

 

错误信息如下:

 

14:54:25,781 INFO  [CachedConnectionManager] Closing a connection for you.  Please close them yourself: org.jboss.resource.adapter.jdbc.WrappedConnection@1a0df30
java.lang.Throwable: STACKTRACE
 at org.jboss.resource.connectionmanager.CachedConnectionManager.registerConnection(CachedConnectionManager.java:290)
 at org.jboss.resource.connectionmanager.BaseConnectionManager2.allocateConnection(BaseConnectionManager2.java:417)
 at org.jboss.resource.connectionmanager.BaseConnectionManager2$ConnectionManagerProxy.allocateConnection(BaseConnectionManager2.java:842)
 at org.jboss.resource.adapter.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:88)
 at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:82)
 at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:423)
 at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
 at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:119)
 at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:57)
 at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1326)
 at com.testprj.common.dao.HibernateSessionManager.beginTransaction(HibernateSessionManager.java:120)
 at com.testprj.common.dao.HibernateDaoImpl.beginTransaction(HibernateDaoImpl.java:149)
 at com.testprj.common.dao.HibernateDaoImpl.findByCriterions(HibernateDaoImpl.java:372)
 at com.testprj.persistence.ss.dao.hbmimpl.MenuDAOImpl.findByRowID(MenuDAOImpl.java:59)
 at com.testprj.domain.base.service.MenuServiceImpl.findByRowID(MenuServiceImpl.java:73)
 at com.testprj.ui.base.ss.WinMenuEdit.getTMenuById(WinMenuEdit.java:311)
 at com.testprj.ui.base.ss.WinMenuEdit.loadMenu(WinMenuEdit.java:173)
 at com.testprj.ui.base.ss.WinMenuEdit.afterCompose(WinMenuEdit.java:73)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654)
 at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:557)
 at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:481)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:378)
 at org.springframework.security.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109)
 at org.springframework.security.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
 at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
 at org.springframework.security.ui.SessionFixationProtectionFilter.doFilterHttp(SessionFixationProtectionFilter.java:67)
 at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
 at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
 at org.springframework.security.ui.ExceptionTranslationFilter.doFilterHttp(ExceptionTranslationFilter.java:101)
 at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
 at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
 at org.springframework.security.providers.anonymous.AnonymousProcessingFilter.doFilterHttp(AnonymousProcessingFilter.java:105)
 at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
 at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
 at org.springframework.security.ui.rememberme.RememberMeProcessingFilter.doFilterHttp(RememberMeProcessingFilter.java:109)
 at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
 at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
 at org.springframework.security.wrapper.SecurityContextHolderAwareRequestFilter.doFilterHttp(SecurityContextHolderAwareRequestFilter.java:91)
 at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
 at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
 at org.springframework.security.ui.basicauth.BasicProcessingFilter.doFilterHttp(BasicProcessingFilter.java:174)
 at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
 at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
 at org.springframework.security.ui.webapp.DefaultLoginPageGeneratingFilter.doFilterHttp(DefaultLoginPageGeneratingFilter.java:86)
 at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
 at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
 at org.springframework.security.ui.AbstractProcessingFilter.doFilterHttp(AbstractProcessingFilter.java:277)
 at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
 at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
 at org.springframework.security.ui.AbstractProcessingFilter.doFilterHttp(AbstractProcessingFilter.java:277)
 at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
 at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
 at org.springframework.security.ui.logout.LogoutFilter.doFilterHttp(LogoutFilter.java:89)
 at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
 at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
 at org.springframework.security.context.HttpSessionContextIntegrationFilter.doFilterHttp(HttpSessionContextIntegrationFilter.java:235)
 at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
 at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
 at org.springframework.security.util.FilterChainProxy.doFilter(FilterChainProxy.java:175)
 at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:236)
 at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
 at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
 at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
 at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
 at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
 at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
 at java.lang.Thread.run(Unknown Source)

 

奇怪的是并非每次执行都有错误,偶尔也会成功!

 

 

目前采用的是webserver的JNDI连接池。

 

 搜了很久,有兄弟建议用c3p0连接池,http://bjzhanghao.cnblogs.com/archive/2004/12/10/75145.html  19楼。

于是修改spring-hibernate配置如下:

   <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource"><ref bean="dataSource"></property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.DB2Dialect</prop>
                <prop key="hibernate.show_sql">false</prop>
                
                <prop key="hibernate.c3p0.min_size">5</prop> 
                <prop key="hibernate.c3p0.max_size">20</prop> 
                <prop key="hibernate.c3p0.timeout">1800</prop> 
                <prop key="hibernate.c3p0.max_statements">50</prop> 
            </props>
        </property>
        <property name="configLocation" value="classpath:/config/hibernate/hibernate.cfg.xml">
    </bean>
    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
        <property name="sessionFactory" ref="sessionFactory"></property></bean>
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory">
            <ref bean="sessionFactory">
        </property>
    </bean>
    <tx:annotation-driven transaction-manager="transactionManager">

    依然没有解决,错误依旧。

    更有兄弟说只是调试信息,没影响。http://hbird.vicp.net/viewthread.php?action=printable&tid=2157

 

    求兄弟们指点!

 


问题补充:
谢谢rain2005。

Jboss中datasource的配置

[code="xml

<datasources>

  <local-tx-datasource>

    <jndi-name>db2s</jndi-name>

    <connection-url>jdbc:db2://172.21.21.2:50000/HOSPDB</connection-url>

    <driver-class>com.ibm.db2.jcc.DB2Driver</driver-class>

    <user-name>db2admin</user-name>

    <password>dhcc</password>

    <min-pool-size>1000</min-pool-size>

       <metadata>

         <type-mapping>db2jcc</type-mapping>

      </metadata>

  </local-tx-datasource>



</datasources>



[/code]





再未使用c3p0的时候报的错,我加入c3p0后依然报错误。
问题补充:
我试了一下,如果不用JNDI,直接在spring里写datasource的配置,则不会出现该错误:



<bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource">
<property name="driverClassName">
<value>com.ibm.db2.jcc.DB2Driver</value>
</property>
<property name="url">
<value>jdbc:db2://172.21.21.2:50000/HOSPDB</value>
</property>
<property name="username">
<value>db2admin</value>
</property>
<property name="password">
<value>dhcc</value>
</property>
</bean>


问题补充:
to rain2005 :

    谢谢!我采用c3p00连接池配置成功了。

   
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass">
<value>com.ibm.db2.jcc.DB2Driver</value>
</property>
<property name="jdbcUrl">
<value>jdbc:db2://172.21.21.2:50000/HOSPDB</value>
</property>
<property name="user">
<value>db2admin</value>
</property>
<property name="password">
<value>dhcc</value>
</property>

......
</bean>






   但是我需要从jndi中取数据源,类似:

  
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"> <value>java:db2s</value> </property> 
</bean>


  

   这种情况下c3p0连接池如何配置呢?
问题补充:
现在的问题是:c3p0数据源和jndi数据源只能用一个,如果用jndi数据源的话,c3p0连接池如何获取jndi的数据源?



如果用

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"> <value>java:db2s</value> </property>

</bean>


的方式获取,如何与c3p0的连接池关联?





另外:如何把transactionManager配置成JNDI获得数据库事务管理器?

望详细指点!谢谢!
问题补充:
非常感谢!



rain2005 (中级程序员)

已经升级了?!!
  • 写回答

4条回答 默认 最新

  • iteye_5200 2008-12-18 14:47
    关注

    那就对了,就是数据源问题,你配c3p0是有问题的
    [code="java"]

    org.hibernate.dialect.DB2Dialect

    false

    <!-- add for c3p0 连接池 -->

    5

    20

    1800

    50

    [/code]
    这样并不是正确的配置c3p0数据源,没有起作用。
    具体你可以参照DriverManagerDataSource的配置方式配置,大同小异。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能