Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C3P0的Hibernate在Oracle上运行良好,但没有关闭与MySQL 5.6的连接_Mysql_Oracle_Hibernate_Servlets - Fatal编程技术网

使用C3P0的Hibernate在Oracle上运行良好,但没有关闭与MySQL 5.6的连接

使用C3P0的Hibernate在Oracle上运行良好,但没有关闭与MySQL 5.6的连接,mysql,oracle,hibernate,servlets,Mysql,Oracle,Hibernate,Servlets,我正在使用Servlet2.4、Hibernate4.2.4Final、C3P00.9.2.1、Tomcat7.0.42、MySQL5.6和JSP 我已经使用Oracle11GR2DB完成了开发,但后来被要求切换到MySQL作为数据库 我手头有一个相当不寻常的问题 问题是为每个DB请求创建了多个MySQL进程/连接,尽管发出了SessionFactoryUtil.close(),但这些进程/连接既没有关闭,也没有返回到池中Oracle DB的情况并非如此 我在这两个不同的数据库上测试了完全相同的

我正在使用Servlet2.4、Hibernate4.2.4Final、C3P00.9.2.1、Tomcat7.0.42、MySQL5.6和JSP

我已经使用Oracle11GR2DB完成了开发,但后来被要求切换到MySQL作为数据库

我手头有一个相当不寻常的问题

问题是为每个DB请求创建了多个MySQL进程/连接,尽管发出了
SessionFactoryUtil.close(),但这些进程/连接既没有关闭,也没有返回到池中Oracle DB的情况并非如此

我在这两个不同的数据库上测试了完全相同的代码,即在执行函数/请求(例如:登录)之后

应用程序在使用Oracle(11gR2)进行测试时,DB创建了一个连接,并将其用于此后的所有请求。
从V$RESOURCE\u LIMIT中选择*
给我以下输出
资源名称:进程
当前使用率:32
最大利用率:36
初始分配:300
极限值:300
无论有多少用户登录到连接池中,都可以优雅地维护它

另一方面,当相同的应用程序在MySQL上运行时:
我做了一个
显示进程列表显示为每个请求创建两个进程;c3p0成功终止了一个连接,但另一个连接仍然存在,直到数据库崩溃,因为它超过了可用的最大连接数

我的SessionFactoryUtil非常简单明了,如下所示:
公共类SessionFactoryUtil{
私有静态SessionFactory SessionFactory

public static SessionFactory getSessionFactory() {
    return sessionFactory = new Configuration().configure()
            .buildSessionFactory();//deprecated method not changed due to official reason
}

public Session getCurrentSession() {
    return sessionFactory.getCurrentSession();
}

public static void close() {
    if (sessionFactory != null) {
        sessionFactory.close();
    }
    sessionFactory = null;
}

我的DAO方法如下

public User getUserByName(String userName) throws FetchException {
User user = null;
Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
try {
    session.beginTransaction();
    user = (User) session.createQuery("from User where userName = '" + userName + "'").uniqueResult();
} catch (Exception e) {
    logger.info("UserDaoImpl -> getUserByName() : Error : " +e);
    e.printStackTrace();
} finally {
    SessionFactoryUtil.close();
}
return user;
c3p0破坏连接的堆栈跟踪如下所示:

20:45:43692 INFO com.mchange.v2.resourcepool.BasicResourcePool:1493-签出的资源已过期,将被销毁:com.mchange.v2.c3p0.impl。NewPooledConnection@61f31fff
20:45:43692 INFO com.mchange.v2.resourcepool.BasicResourcePool:1496-记录用于签出过期资源的堆栈跟踪。
异常:调试堆栈跟踪:过期的资源签出堆栈跟踪。
位于com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:555)
在com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutAndMarkConnectionInUse(C3P0PooledConnectionPool.java:755)
在com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:682)
位于com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:140)
位于org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider.getConnection(C3P0ConnectionProvider.java:84)
位于org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.ActainConnection(AbstractSessionImpl.java:292)
位于org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.ActainConnection(LogicalConnectionImpl.java:214)
位于org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:157)
位于org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:67)
位于org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:160)
位于org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1426)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(未知源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke处(未知源)
位于java.lang.reflect.Method.invoke(未知源)
位于org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:352)
位于com.sun.proxy.$Proxy7.beginTransaction(未知来源)
位于com.demo.access.impl.ConfDaoImp.showAllEvents(ConfDaoImp.java:939)
位于com.demo.business.impl.confserviceinpl.showAllEvents(confserviceinpl.java:404)
位于com.demo.controller.UserController.getControls(UserController.java:112)
位于com.demo.controller.UserController.validateUser(UserController.java:93)
位于com.demo.controller.UserController.process(UserController.java:42)
位于com.demo.controller.ApplicationServlet.process(ApplicationServlet.java:75)
位于com.demo.controller.ApplicationServlet.doPost(ApplicationServlet.java:53)
位于javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
位于javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
位于com.demo.controller.LoginFilter.doFilter(LoginFilter.java:37)
位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
位于org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
位于org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185)
位于org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
位于org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151)
位于org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
位于org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
位于org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
位于org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
位于org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269)
位于org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
位于org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.r
public class SessionFactoryUtil {
private static SessionFactory sessionFactory;
private static ServiceRegistry serviceRegistry;

public static SessionFactory getSessionFactory() {
    Configuration configuration = new Configuration();
    configuration.configure();
    serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();        
    sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    return sessionFactory;
}

public static Session getCurrentSession() {
    if(sessionFactory == null){
        getSessionFactory();
    }
    return sessionFactory.getCurrentSession();
}

public static void close() {
    if(sessionFactory instanceof SessionFactoryImpl) {
          SessionFactoryImpl sf = (SessionFactoryImpl)sessionFactory;
          ConnectionProvider conn = sf.getConnectionProvider();
          if(conn instanceof C3P0ConnectionProvider) { 
            ((C3P0ConnectionProvider)conn).close(); 
          }
       }
    sessionFactory.close();
}
    <!-- Database connection settings -->
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/application</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">root</property>

    <property name="show_sql">true</property>
    <property name="format_sql">false</property>

     <!-- SQL dialect -->
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

     <!-- Enable Hibernate's automatic session context management -->
    <property name="hibernate.current_session_context_class">thread</property>
    <property name="hibernate.connection.release_mode">auto</property>

    <!-- Create or update the database schema on startup -->
    <property name="hibernate.hbm2ddl.auto">none</property>

    <!-- DEPRECATED -->
    <!--        <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> -->
    <!-- C3p0 connection pooling configuration -->
    <property name="hibernate.connection.provider_class">org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider</property>
    <property name="c3p0.unreturnedConnectionTimeout">600</property>
    <property name="c3p0.debugUnreturnedConnectionStackTraces">false</property>
    <!--        configuration pool via c3p0    -->
    <property name="c3p0.acquire_increment">1</property>   
    <property name="c3p0.idle_test_period">600</property>    
    <property name="c3p0.max_size">75</property>   
    <property name="c3p0.max_statements">5</property>   
    <property name="c3p0.min_size">5</property>   
    <property name="c3p0.timeout">600</property>
    <property name="c3p0.checkoutTimeout">6000000</property>

    <property name="c3p0.testConnectionOnCheckout">false</property>
    <property name="c3p0.testConnectionOnCheckin">true</property>   

    <!-- Mapping -->

</session-factory>
public User getUserByName(String userName) throws FetchException { User user = null; Session session = SessionFactoryUtil.getCurrentSession(); try { session.beginTransaction(); user = (User) session.createQuery("from User where userName = '" + userName + "'").uniqueResult(); session.getTransaction().commit(); } catch (Exception e) { logger.info("UserDaoImpl -> getUserByName() : Error : " +e); e.printStackTrace(); } finally { } return user;
public static void close() {
if(sessionFactory instanceof SessionFactoryImpl) {
      SessionFactoryImpl sf = (SessionFactoryImpl)sessionFactory;
      ConnectionProvider conn = sf.getConnectionProvider();
      if(conn instanceof C3P0ConnectionProvider) { 
        ((C3P0ConnectionProvider)conn).close(); 
      }
   }
sessionFactory.close(); }