gpt4 book ai didi

spring - org.hibernate.exception.GenericJDBCException : Cannot open connection

转载 作者:行者123 更新时间:2023-12-03 20:29:29 25 4
gpt4 key购买 nike

我一直在努力解决这个问题一段时间。我有一个使用 Struts2、spring 和 Hibernate 的基于 Web 的应用程序。我使用 Spring 将 struts action 和 business 和 dao 层连接在一起。
我正在使用 JMeter 对应用程序进行负载测试。当我模拟 1 个用户重复发送获取请求时,该应用程序运行良好,没有问题。但是当我添加更多用户时,一段时间后我收到以下错误:

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 stats 来检查打开 session 的数量。处理请求后,所有 session 都将关闭。我正在使用 OpenSessionInViewFilter,所以每个请求都有一个 session 。

以下是所有文件
网页.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 层,我收集有关打开和关闭 session 的统计信息,因为我模拟了 4 个用户,所以差异永远不会超过 4。看起来所有的 session 都被关闭了。处理请求时。如果我不使用 spring 并使用自己的 SessionFactory 自己管理 Hibernate,打开和关闭 session ,一切正常并且没有错误。
我很困惑,因为我没有看到任何 session 被泄露,任何指针都将不胜感激。

最佳答案

DriverManagerDataSource不打算在生产中使用,在生产中你想使用连接池,DriverManagerDataSource不是连接池,我建议使用 Tomcat JDBC 或 Commons DBCP 作为连接池。

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

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

最后,无关的,提示您的Log4jConfigListener应该在 ContextLoaderListener 之前配置如果您希望 Log4j 正确初始化。虽然我怀疑你需要它作为 log4j.xml在你的类路径上,所以可能 Log4J 已经被初始化了。

关于spring - org.hibernate.exception.GenericJDBCException : Cannot open connection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23485056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com