0

L'objectif est de faire fonctionner une application J2EE sur un WebsphereApplicationServer 7, qui accède à une source de données JDBC (DB2) via OpenJPA 2.0. Sur la plupart de nos serveurs de test, mon code fonctionne correctement; Cependant, nous avons un testserver où le EntityManager avorte/ne soit pas initialisé correctement à cause d'une connexion périmée (« java.net.SocketException: Broken pipe »):La transaction de printemps/gestionnaire d'entité ne compense pas les connexions périmées (sur websphere + openJPA)?

       <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 

Je travaille avec OpenJPA en utilisant le Springframework 3.0 JpaTransactionManager et LocalContainerEntityManagerFactory pour obtenir mon contexte de persistance:

<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> 

Le persistence.xml est la suivante:

<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> 

J'ai besoin pour redémarrer le serveur sur lequel l'application s'exécute pour l'exception à disparaître à nouveau - avant que (de manière aléatoire?) apparaît à nouveau.

Sur googler le problème, j'ai trouvé un site qui a mentionné qu'il était le code défectueux (pas de validation sur les transactions) qui cause le problème: http://mikeschubert.com/2006/08/03/javanetsocketex/ Cependant, je suis sous l'impression que le JPATransactionManager est censé prendre soin de cela.

D'autres sites Web ont mentionné que la mise en œuvre d'un pool de connexion aiderait (lors de l'utilisation d'Hibernate en communication avec un serveur Tomcat, par exemple elegantly handling stale database connections in Hibernate/Spring Transactions); Toutefois, Websphere Application Server gère déjà un pool de connexions pour la source de données jdbc/activities (minSize: 1; maxSize: 10; Timeout de connexion: 180 sec; Reap time: 180sec; Timeout inutilisé: 1800 sec; Purge policy: FailingConnectionOnly).

Tous les conseils sur l'endroit où je devrais commencer à regarder dans le problème serait génial.

Répondre

0

Il est possible que si vous ne définissez pas la variable de registre DB2COMM, une erreur de communication peut se produire.

DB2COMM doit être défini sur TCPIP.

+0

C'était l'une des premières choses que j'ai vérifiées; DB2COMM est défini sur TCPIP. – subrunner

Questions connexes