当前位置: 首页 > 知识库问答 >
问题:

组织。冬眠例外GenericJDBCException:无法打开连接

祝俊
2023-03-14

我已经为这个问题挣扎了一段时间了。我有一个使用Struts2、spring和Hibernate的基于web的应用程序。我使用Spring将struts动作、业务和dao层连接在一起。我正在使用JMeter对应用程序进行负载测试。当我模拟1个用户反复发送get请求时,应用程序运行良好,没有问题。但是,当我再添加几个用户时,过了一段时间后,我得到以下错误:

Caused by: org.hibernate.exception.GenericJDBCException: Cannot open connection
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140)
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:52)
    at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:449)
    at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
    at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:160)
    at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:81)
    at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1473)
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:510)
    ... 104 more
Caused by: java.sql.SQLException: Listener refused the connection with the following error:
ORA-12519, TNS:no appropriate service handler found
The Connection descriptor used by the client was:
192.168.1.118:1521:BAADB

    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:261)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:387)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:414)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801)
    at java.sql.DriverManager.getConnection(DriverManager.java:582)
    at java.sql.DriverManager.getConnection(DriverManager.java:154)
    at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:173)
    at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriver(DriverManagerDataSource.java:164)
    at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnectionFromDriver(AbstractDriverBasedDataSource.java:149)
    at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnection(AbstractDriverBasedDataSource.java:119)
    at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:81)
    at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
    ... 109 more 

所以,我假设这是一个连接泄漏,但是当我模拟一个用户连续发送请求时,我不应该得到相同的错误(唯一的区别是,我会在稍后得到错误)。在执行任何dao请求之前,我启用了Hibernate统计来检查打开的会话数。处理请求后,所有会话都将关闭。我使用的是OpenSessionInViewFilter,因此每个请求都有一个会话。

以下是网站上的所有文件。xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
    "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/applicationContext-security.xml
            /WEB-INF/spring-database.xml
            /WEB-INF/application-action.xml
            /WEB-INF/newbeans.xml
        </param-value>
    </context-param>
    <filter> <!-- Get spring to keep the session open for the whole request, so Hibernates lazy loads work -->
        <filter-name>openSessionInViewFilter</filter-name>
        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>openSessionInViewFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- - Loads the root application context of this web app at startup. - 
        The application context is then available via - WebApplicationContextUtils.getWebApplicationContext(servletContext). -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <listener>
        <listener-class>
            net.sf.navigator.menu.MenuContextListener</listener-class>
    </listener>

    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>/WEB-INF/classes/log4j.properties</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

Spring和Hibernate文件

<beans xmlns="http://www.springframework.org/schema/beans"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:aop="http://www.springframework.org/schema/aop"
               xmlns:tx="http://www.springframework.org/schema/tx"
               xsi:schemaLocation="
               http://www.springframework.org/schema/beans 
               http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
               http://www.springframework.org/schema/tx 
               http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
               http://www.springframework.org/schema/aop 
               http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
    <tx:annotation-driven/>
    <bean id="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
        <property name="url" value="jdbc:oracle:thin:@192.168.1.118:1521:BAADB" />
        <property name="username" value="htwork" />
        <property name="password" value="*****" />
    </bean>         
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="myDataSource" />
        <property name="annotatedClasses">
            <list>
                <value>com.tda.ht.bean.SerialNumbers</value>
                <value>com.tda.ht.bean.Bunos</value>
                <value>com.tda.ht.bean.Tms</value>
                <value>com.tda.ht.bean.Custodian</value>
                <value>com.tda.ht.bean.CMISConfEntry</value>
                <value>com.tda.ht.bean.HeloTrackCurrentBunoConf</value>
                <value>com.tda.ht.bean.RepairBean</value>
                <value>com.tda.ht.bean.TDIncorporation</value>
                <value>com.tda.ht.bean.Miscellaneous</value>
                <value>com.tda.ht.bean.Inspection</value>
                <value>com.tda.ht.bean.HTComponentHistory</value>
                <value>com.tda.ht.bean.Component</value>
                <value>com.tda.baa.dao.TransferRequest</value>
                <value>com.tda.baa.dao.UsersTable</value>
                <value>com.tda.baa.dao.UserRoles</value>
                <value>com.tda.ht.bean.EHRCurrentBunoConf</value>
                <value>com.tda.ht.bean.SRCCurrentBunoConf</value>
                <value>com.tda.ht.bean.ASRCurrentBunoConf</value>
                <value>com.tda.ht.bean.ASRSubCurrentBunoConf</value>
                <value>com.tda.ht.bean.ASRTree</value>
                <value>com.tda.ht.bean.PMICTree</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.generate_statistics">true</prop>
                <prop key="hibernate.c3p0.min_size">5</prop>
                <prop key="hibernate.c3p0.max_size">20</prop>
                <prop key="hibernate.c3p0.timeout">300</prop>
                <prop key="hibernate.c3p0.max_statements">50</prop>
                <prop key="hibernate.c3p0.idle_test_period">3000</prop>
            </props>
        </property>
    </bean>
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

    <bean id="componentDAO" class="com.tda.ht.dao.component.ComponentDAOImpl">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>

    <bean id="componentBusiness" class="com.tda.ht.business.component.ComponentBusinessImpl">
        <property name="iCompDAO" ref="componentDAO"></property>
    </bean>
</beans>

请求组件业务的操作方法调用-这由spring管理

public String displayHeader() {
    Component c = componentBusiness.getComponentByPartNumber(partNumber);
    return SUCCESS;
}

业务层

package com.tda.ht.business.component;
import java.util.List;
import org.springframework.transaction.annotation.Transactional;
import com.tda.ht.bean.Component;
import com.tda.ht.dao.component.IComponentDAO;

public class ComponentBusinessImpl implements IComponentBusiness {
    private IComponentDAO iCompDAO;

    //service layer method, transactions handled by spring
    @Transactional(readOnly = true)
    public Component getComponentByPartNumber(String partNumber) {
        // TODO Auto-generated method stub
        return iCompDAO.getComponentByPartNumber(partNumber);
    }
}

DAO层

public class ComponentDAOImpl implements IComponentDAO {

SessionFactory sessionFactory;

protected static org.apache.log4j.Logger log = Logger
                .getLogger(ComponentDAOImpl.class);

//dao method called from service layer

@Override
public Component getComponentByPartNumber(String partNumber) {
    String[] arguments = { partNumber };

    long open = sessionFactory.getStatistics().getSessionOpenCount();
    long close = sessionFactory.getStatistics().getSessionCloseCount();

        log.error("Open " + open + " Close " + close);
        Session s = sessionFactory.getCurrentSession();

        log.error(" SESSION IS " + s.hashCode());

        try {
            Query q = s.createQuery("Select entry from Component as entry where entry.partNumber = ?");

            q.setParameter(0, partNumber);
            List<Component> list = q.list();

            if (list.size() > 0)
                return list.get(0);

            return null;
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            //s.close();
        }
    return null;
    }        
}

在dao层中,我收集关于打开和关闭会话的统计数据,因为我模拟了4个用户,所以差异永远不会超过4。看起来所有会话都已关闭。当请求被处理时。如果我不使用spring并通过自己的SessionFactory、打开和关闭会话来管理Hibernate,那么一切都可以正常工作,不会出现错误。我很困惑,因为我没有看到任何会话被泄露,任何提示都将不胜感激。

共有1个答案

段干靖
2023-03-14

drivermanagedatasource不适用于生产环境,在生产环境中,如果要使用连接池,drivermanagedatasource不是连接池,我建议使用类似Tomcat JDBC或Commons DBCP的连接池。

您的hibernate. c3p0设置是无用的,因为您正在用Spring配置和注入数据源,因此这些属性将被忽略。

最后,您的DAO代码(可能)有缺陷,您不应该捕获并吞下Exc0019,因为这可能会破坏正确的tx管理。

如果希望Log4j正确初始化,则应在ContextLoaderListener之前配置最后一个不相关的提示。尽管我怀疑您是否需要它作为log4j。xml位于YOUR类路径上,因此可能Log4J已经初始化。

 类似资料:
  • 我正在使用Hibernate、Java和MySQL以及一个多线程应用程序,当我试图打开一个事务时,有时会抛出以下异常。 冬眠动物。JAVA 堆栈跟踪 连接打开,有时会出现此错误。为什么?

  • 我在本地机器上安装了一个mysql实例,并将其与GAE上的java hibernate应用程序一起使用。这是完美的工作,但从下午开始,它已经开始给我下面给出的错误。请帮我弄清楚如何解决这个问题。我被卡住了,无法在没有任何db事务的情况下继续使用代码。谢谢

  • 我需要你帮我把冬眠映射成一对多我不知道为什么这是错的 另一类: 映射 另一个映射: Hibernate配置 这就是错误: 如果有人能帮我,我非常感激,谢谢!

  • 我正在尝试从当前用户那里获取特定租金的列表。 控制器中的代码: account\u id是外键。 运行后,我发现错误: 我做错了什么?

  • 我想写一个简单的不存在的地方子句HQL查询。我不熟悉Hibernate,我有一些小问题。 我的查询如下所示: 我想选择所有包含IDUser当天购买的门票的天数。所有这些都与id为IDFest的节日相关。 我的堆栈跟踪: 映射类: Day.java Festivals.java 门票。Java语言

  • 我得到这个错误的原因很奇怪。我将解释这个错误是按时间顺序排列的,以便更容易理解。 这是我的JPA查询,在我添加po之前,它一直工作得很好。it的customer\u id。 商店订单构造器 错误: 我很困惑为什么我调用的表中的一列不被识别。我已经玩了一段时间了,但感觉就像在追我的尾巴。 -------更新------- 我注意到表中的其他BigInt变量在构造函数中很长。因此,我将customer