0

目标是让 J2EE 应用程序在 WebsphereApplicationServer 7 上运行,该应用程序通过 OpenJPA 2.0 访问 JDBC 数据源 (DB2)。在我们的大多数测试服务器上,我的代码运行良好;但是,我们有一个测试服务器,其中 EntityManager 中止/由于过时的连接(“java.net.SocketException: Broken pipe”)而没有正确初始化:

                             <openjpa-2.1.2-SNAPSHOT-r422266:1384519 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: Failed to execute query "select count(x.profSurname) from Surname x where x.profUsrstate = 0". Check the query syntax for correctness. See nested exception for details.
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:872)
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:794)
at org.apache.openjpa.kernel.DelegatingQuery.execute(DelegatingQuery.java:542)
at org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:315)
at org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:331)
at org.apache.openjpa.persistence.QueryImpl.getSingleResult(QueryImpl.java:359)
    (...)
Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException: [jcc][t4][2030][11211][4.13.127] A communication error occurred during operations on the connection's underlying socket, socket input stream, 
or socket output stream.  Error location: T4Agent.sendRequest() - flush (-1).  Message: Broken pipe. ERRORCODE=-4499, SQLSTATE=08001 {prepstmnt 1826931080 SELECT COUNT(t0.PROF_SURNAME) FROM EMPINST.SURNAME t0 WHERE (t0.PROF_USRSTATE = CAST(? AS BIGINT))  optimize for 1 row [params=?]} [code=-4499, state=08001]
at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:281)
at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:265)
at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$700(LoggingConnectionDecorator.java:72)
at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.executeQuery(LoggingConnectionDecorator.java:1183)
at org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:284)
at org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement.executeQuery(JDBCStoreManager.java:1787)
at org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:274)
at org.apache.openjpa.jdbc.sql.SelectImpl.executeQuery(SelectImpl.java:499)
at org.apache.openjpa.jdbc.sql.SelectImpl.execute(SelectImpl.java:424)
at com.ibm.ws.persistence.jdbc.sql.SelectImpl.execute(SelectImpl.java:89)
at org.apache.openjpa.jdbc.sql.SelectImpl.execute(SelectImpl.java:391)
at org.apache.openjpa.jdbc.sql.LogicalUnion$UnionSelect.execute(LogicalUnion.java:427)
at org.apache.openjpa.jdbc.sql.LogicalUnion.execute(LogicalUnion.java:230)
at org.apache.openjpa.jdbc.sql.LogicalUnion.execute(LogicalUnion.java:220)
at org.apache.openjpa.jdbc.kernel.SelectResultObjectProvider.open(SelectResultObjectProvider.java:94)
at org.apache.openjpa.kernel.QueryImpl$PackingResultObjectProvider.open(QueryImpl.java:2070)
at org.apache.openjpa.kernel.QueryImpl.singleResult(QueryImpl.java:1320)
at org.apache.openjpa.kernel.QueryImpl.toResult(QueryImpl.java:1242)
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:1007)
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:863)
... 113 more
---- Begin backtrace for Nested Throwables
com.ibm.websphere.ce.cm.StaleConnectionException: [jcc][t4][2030][11211][4.13.127] A communication error occurred during operations on the connection's underlying socket, socket input stream, 
or socket output stream.  Error location: T4Agent.sendRequest() - flush (-1).  Message: Broken pipe. ERRORCODE=-4499, SQLSTATE=08001
at sun.reflect.GeneratedConstructorAccessor91.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:39)
at java.lang.reflect.Constructor.newInstance(Constructor.java:527)
at com.ibm.websphere.rsadapter.GenericDataStoreHelper.mapExceptionHelper(GenericDataStoreHelper.java:607)
at com.ibm.websphere.rsadapter.GenericDataStoreHelper.mapException(GenericDataStoreHelper.java:666)
at com.ibm.ws.rsadapter.AdapterUtil.mapException(AdapterUtil.java:2271)
at com.ibm.ws.rsadapter.jdbc.WSJdbcUtil.mapException(WSJdbcUtil.java:1185)
at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.executeQuery(WSJdbcPreparedStatement.java:726)
at org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:286)
at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.executeQuery(LoggingConnectionDecorator.java:1181)
at org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:284)
at org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement.executeQuery(JDBCStoreManager.java:1787)
at org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:274)
at org.apache.openjpa.jdbc.sql.SelectImpl.executeQuery(SelectImpl.java:499)
at org.apache.openjpa.jdbc.sql.SelectImpl.execute(SelectImpl.java:424)
at com.ibm.ws.persistence.jdbc.sql.SelectImpl.execute(SelectImpl.java:89)
at org.apache.openjpa.jdbc.sql.SelectImpl.execute(SelectImpl.java:391)
at org.apache.openjpa.jdbc.sql.LogicalUnion$UnionSelect.execute(LogicalUnion.java:427)
at org.apache.openjpa.jdbc.sql.LogicalUnion.execute(LogicalUnion.java:230)
at org.apache.openjpa.jdbc.sql.LogicalUnion.execute(LogicalUnion.java:220)
at org.apache.openjpa.jdbc.kernel.SelectResultObjectProvider.open(SelectResultObjectProvider.java:94)
(...)
Caused by: java.net.SocketException: Broken pipe
   at java.net.SocketOutputStream.socketWrite0(Native Method)
   at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:103)
   at java.net.SocketOutputStream.write(SocketOutputStream.java:147)
   at com.ibm.db2.jcc.t4.fb.b(fb.java:1685)
   at com.ibm.db2.jcc.t4.fb.a(fb.java:1633)
   at com.ibm.db2.jcc.t4.a.D(a.java:421)
   ... 138 more

我正在使用 Springframework 3.0 JpaTransactionManager 和 LocalContainerEntityManagerFactory 使用 OpenJPA 来获取我的持久性上下文:

<tx:annotation-driven transaction-manager="lctxManager" /> 
  <bean id="lctxManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="lcentityManagerFactory"></property>
  </bean> 
  <bean id="lcentityManagerFactory"  class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
   <property name="persistenceUnitName" value="activities"/>
    <property name="jpaVendorAdapter">
      <bean class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter">
        <property name="showSql" value="false"></property>
      </bean>
    </property>
</bean> 

persistence.xml 如下:

<persistence-unit name="activities" transaction-type="RESOURCE_LOCAL">
    <non-jta-data-source>jdbc/activities</non-jta-data-source>
    <!-- My classes -->
    <exclude-unlisted-classes>true</exclude-unlisted-classes>

    <properties>
        <property name="openjpa.TransactionMode" value="local" />
    </properties>

我需要重新启动运行应用程序的服务器,以使异常再次消失——在它(随机?)再次弹出之前。

在谷歌搜索问题时,我发现一个网站提到它是导致问题的错误代码(没有提交事务):http: //mikeschubert.com/2006/08/03/javanetsocketex/ 但是,我的印象是JPATransactionManager 应该负责这一点。

其他网站提到实现连接池会有所帮助(当使用 Hibernate 与 Tomcat 服务器通信时,例如在 Hibernate/Spring Transactions 中优雅地处理陈旧的数据库连接);但是,Websphere Application Server 已经为 jdbc/activities 数据源管理了一个连接池(minSize:1;maxSize:10;连接超时:180 秒;获取时间:180 秒;未使用超时:1800 秒,清除策略:FailingConnectionOnly)。

关于我应该从哪里开始研究问题的任何提示都会很棒。

4

1 回答 1

0

如果您不设置DB2COMM注册表变量,则可能会发生通信错误。

DB2COMM应设置为TCPIP

于 2013-10-17T05:52:55.730 回答