com.ibm.websphere.ce.cm.ConnectionWaitTimeoutException: CWTE_NORMAL_J2CA1009

com.ibm.websphere.ce.cm.ConnectionWaitTimeoutException: CWTE_NORMAL_J2CA1009

我在 Websphere 8.5 上部署了一个 Java 应用程序,我使用的是 hibernate-core-4.2.21.Final 和 hibernate-jpa-2.0-api-1.0.1.Final.

我使用 websphere 数据源连接到数据库。有时应用程序无法打开与数据源的连接,我收到错误消息:

org.hibernate.exception.GenericJDBCException: Could not open connection
        at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54)
        at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:124)
        at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109)
        at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:221)
        at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:157)
        at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.connection(StatementPreparerImpl.java:56)
        at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.doPrepare(StatementPreparerImpl.java:159)
        at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:183)
        at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:157)
        at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1881)
        at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1858)
        at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1838)
        at org.hibernate.loader.Loader.doQuery(Loader.java:906)
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:348)
        at org.hibernate.loader.Loader.doList(Loader.java:2550)
        at org.hibernate.loader.Loader.doList(Loader.java:2536)
        at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2366)
        at org.hibernate.loader.Loader.list(Loader.java:2361)
        at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:124)
        at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1623)
        at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:374)
        at com.myapp.testApp.entities.RequestHome.findByUser(RequestHome.java:111)
        at com.myapp.jsf.beans.testApp.Tracking.loadUnderStudyTasks(Tracking.java:307)
        at com.myapp.jsf.beans.testApp.Tracking.inboxQueue(Tracking.java:232)
        at com.myapp.jsf.beans.testApp.Tracking.onload(Tracking.java:77)
        at sun.reflect.GeneratedMethodAccessor19066.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
        at java.lang.reflect.Method.invoke(Method.java:611)
        at org.jboss.el.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:328)
        at org.jboss.el.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:341)
        at org.jboss.el.parser.AstPropertySuffix.invoke(AstPropertySuffix.java:58)
        at org.jboss.el.parser.AstValue.invoke(AstValue.java:96)
        at org.jboss.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
        at com.sun.faces.facelets.el.TagMethodExpression.invoke(Unknown Source)
        at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(Unknown Source)
        at com.sun.faces.application.ActionListenerImpl.processAction(Unknown Source)
        at org.primefaces.application.DialogActionListener.processAction(DialogActionListener.java:45)
        at javax.faces.component.UIViewAction.broadcast(Unknown Source)
        at javax.faces.component.UIViewRoot.broadcastEvents(Unknown Source)
        at javax.faces.component.UIViewRoot.processApplication(Unknown Source)
        at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(Unknown Source)
        at com.sun.faces.lifecycle.Phase.doPhase(Unknown Source)
        at com.sun.faces.lifecycle.LifecycleImpl.execute(Unknown Source)
        at javax.faces.webapp.FacesServlet.service(Unknown Source)
        at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1230)
        at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:779)
        at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:478)
        at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
        at com.ibm.ws.webcontainer.filter.WebAppFilterChain.invokeTarget(WebAppFilterChain.java:136)
        at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:97)
        at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:100)
        at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
        at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
        at com.filenet.ae.toolkit.server.servlet.filter.PostprocessorFilter.doFilter(PostprocessorFilter.java:38)
        at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
        at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
        at com.filenet.ae.toolkit.server.servlet.filter.ContainerBasedFilter.doFilter(ContainerBasedFilter.java:218)
        at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
        at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
        at com.filenet.ae.toolkit.server.servlet.filter.PreprocessorFilter.doFilter(PreprocessorFilter.java:91)
        at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
        at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
        at com.filenet.ae.toolkit.server.servlet.filter.SecurityPluginFilter.doFilter(SecurityPluginFilter.java:202)
        at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
        at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
        at com.filenet.ae.toolkit.server.servlet.filter.ThreadLocalCleanupFilter.doFilter(ThreadLocalCleanupFilter.java:50)
        at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
        at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
        at com.myapp.web.filter.CoordinatorSecurityFilter.doFilter(CoordinatorSecurityFilter.java:208)
        at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
        at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
        at com.dataserve.common.CompatibleFilter.doFilter(CompatibleFilter.java:53)
        at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
        at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
        at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:964)
        at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1104)
        at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3901)
        at com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:304)
        at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:981)
        at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1662)
        at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:200)
        at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:463)
        at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:530)
        at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:316)
        at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:287)
        at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.sendToDiscriminators(NewConnectionInitialReadCallback.java:214)
        at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.complete(NewConnectionInitialReadCallback.java:113)
        at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:175)
        at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
        at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
        at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
        at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
        at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
        at com.ibm.io.async.ResultHandler.run(ResultHandler.java:905)
        at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1865)
    Caused by: com.ibm.websphere.ce.cm.ConnectionWaitTimeoutException: CWTE_NORMAL_J2CA1009
        at com.ibm.ws.rsadapter.AdapterUtil.toSQLException(AdapterUtil.java:1680)
        at com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource.getConnection(WSJdbcDataSource.java:661)
        at com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource.getConnection(WSJdbcDataSource.java:611)
        at org.hibernate.service.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:141)
        at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:301)
        at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:214)
        ... 91 more

我是如何进行交易的:

UserTransaction txn = EntityHome.getInstance().getTransaction();
txn.begin();
RequestHome requestHome = new RequestHome();
requestHome.doSomething();
txn.commit();

实体主页class:

public class EntityHome {

    protected static final Log log = LogFactory.getLog(EntityHome.class);
    protected SessionFactory sessionFactory;
    private static ServiceRegistry serviceRegistry;
    private static EntityHome entityHome;

    public static EntityHome getInstance() {
        if (entityHome == null) {
            try {
                entityHome = new EntityHome();
            } catch (Exception e) {
                AppLogger.log("########### unable to configure hibernate,exception is: " + e.getMessage());
                entityHome = null;
            }
        }
        return entityHome;
    }

    private EntityHome() throws Exception {
        try {
            configureHibernate();
        } catch (Exception e) {
            throw e;
        }
    }

    private void configureHibernate() throws HibernateException {

        Configuration configuration = new Configuration().configure("hibernate-efada.cfg.xml");
        serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())
                .buildServiceRegistry();
        sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    }

    public SessionFactory getSessionFactory() throws NamingException {
        if (sessionFactory == null || sessionFactory.isClosed()) {
            configureHibernate();
        }
        return sessionFactory;
    }

    public UserTransaction getTransaction() {

        UserTransaction transaction = null;

        try {
            Object o = new InitialContext().lookup("java:comp/UserTransaction");
            transaction = (UserTransaction) o;
            transaction.setTransactionTimeout(30);
            return transaction;
        } catch (Exception e) {
            e.printStackTrace();
            AppLogger.log("########### unable to getTransaction,exception is: " + e.getMessage());
            throw new IllegalStateException("Could not locate java:comp/UserTransaction in JNDI");
        }
    }
}

休眠配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
                                         "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
 <session-factory>
  
    <property name="hibernate.session_factory_name">EfadaSessionFactory</property>
    <property name="hibernate.connection.isolation">1</property> <!-- READ UNCOMMITTED -->
    <!-- <property name="hibernate.hbm2ddl.auto">validate</property> -->
    <property name="hibernate.show_sql">false</property>
    <property name="hibernate.format_sql">true</property>
    <property name="hibernate.connection.datasource">EfadaDS</property>
    <property name="hibernate.default_schema">dbo</property>
    <property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
    <property name="hibernate.connection.autocommit">false</property>
    <property name="hibernate.jndi.class">com.ibm.websphere.naming.WsnInitialContextFactory</property>

        
    <property name="hibernate.jndi.url">corbaloc::myserver-prod-fnicn1.mydomain.com:2809,:myserver-prod-FNICN2.mydomain.com:2809,:myserver-prod-fnicn1.mydomain.com:2811,:myserver-prod-FNICN2.mydomain.com:2811,:myserver-prod-fnicn1.mydomain.com:2812,:myserver-prod-FNICN2.mydomain.com:2812</property> 

    <property name="hibernate.transaction.auto_close_session">true</property>
    <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property>
    <property name="hibernate.transaction.flush_before_completion">true</property>

    <property name="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.WebSphereExtendedJTATransactionLookup</property>

    <property name="hibernate.current_session_context_class">jta</property>
    <property name="jta.UserTransaction">java:comp/UserTransaction</property>
    
    <mapping resource="gov/mci/myapp/entities/User.hbm.xml"/>

 </session-factory>
</hibernate-configuration>

我将数据源中的最大连接数从 100 增加到 300,但仍然出现此错误。我是否必须更改我的数据源配置或休眠配置中的其他内容?

您的应用程序正在泄漏连接,并且没有将它们正确返回到数据源。

您可以使用 WebSphere PMI(性能监控基础设施)来监控您的数据源。您很可能会看到许多 'creates' 但没有 'closes' 的连接。

您还可以启用连接泄漏逻辑跟踪以查看连接的保存位置: https://www.ibm.com/support/pages/how-troubleshoot-j2ca0045e-connection-pooling-problems

在跟踪规范中,输入以下字符串: ConnLeakLogic=all

对您的应用程序设计的一些补充意见:

  1. 不要使用 Hibernate - WebSphere 已经提供了 JPA 提供程序,您应该编写 JPA API 而不是使用 Hibernate 对象。像这样使用 JPA - https://openliberty.io/guides/jpa-intro.html
  2. 不要手动管理事务 - 您应该依靠容器来管理您的事务。手动处理交易很容易出错。

对 websphere 数据源进行以下更改后,问题消失了:

  • webSphereDefaultIsolationLevel : 1 // 已读未提交
  • webSphereDefaultQueryTimeout : 30 // 数据源的默认查询超时