2010-02-20 78 views
2

有两个用户同时使用我的简单的应用程序,我得到异常:Eclipse的链接JPA问题

Error Code: 0 
Call: SELECT ID, NAME, IMAGE FROM GameObjectTable ORDER BY ID ASC 
Query: ReadAllQuery(referenceClass=GameObject sql="SELECT ID, NAME, IMAGE FROM GameObjectTable ORDER BY ID ASC") 

Caused by: org.postgresql.util.PSQLException: There was In/Out error while sending to server 
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:283) 
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:479) 
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:367) 
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:271) 
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeSelect(DatabaseAccessor.java:891) 
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:601) 
... 116 more 
Caused by: java.io.IOException: Stream closed 
at sun.nio.cs.StreamEncoder.ensureOpen(StreamEncoder.java:26) 
at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:121) 
at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:212) 
at org.postgresql.core.PGStream.flush(PGStream.java:507) 
at org.postgresql.core.v3.QueryExecutorImpl.sendSync(QueryExecutorImpl.java:1107) 
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:256) 
... 121 more 

方法cousing错误是:

@Repository 
public class GameObjectDao{ 
    @PersistenceContext(type = PersistenceContextType.EXTENDED) 
    protected EntityManager entityManager; 
    @Transactional 
    public List<String> getGameObjectNames() { 
    return getEntityManager().createQuery("select g.name from GameObject as g").getResultList(); 
... 
} 

}

Spring的事务管理器:

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory"/> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 
<tx:annotation-driven /> 

哪里不对?

// EDIT

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter"> 
      <property name="showSql" value="false"/> 
     </bean> 
    </property> 

    <property name="loadTimeWeaver"> 
     <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/> 
    </property> 
    <property name="jpaDialect"> 
     <bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect "/> 
    </property> 

</bean> 

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="org.postgresql.Driver"/> 
    <property name="url" value="${db.url}"/> 
    <property name="username" value="${db.username}"/> 
    <property name="password" value="${db.password}"/> 
</bean> 

在MySQL误差是不同的:

Caused by: java.lang.reflect.InvocationTargetException 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
at org.apache.wicket.session.DefaultPageFactory.createPage(DefaultPageFactory.java:192) 
... 69 more 
    Caused by: java.lang.NullPointerException 
at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:1646) 
at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:1622) 
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1332) 
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeSelect(DatabaseAccessor.java:891) 
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:601) 
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:529) 
at org.eclipse.persistence.internal.sessions.AbstractSession.executeCall(AbstractSession.java:914) 
at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:205) 
at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:191) 
at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeSelectCall(DatasourceCallQueryMechanism.java:262) 
at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.selectAllRows(DatasourceCallQueryMechanism.java:618) 
at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRowsFromTable(ExpressionQueryMechanism.java:2537) 
at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRows(ExpressionQueryMechanism.java:2496) 
at org.eclipse.persistence.queries.ReadAllQuery.executeObjectLevelReadQuery(ReadAllQuery.java:455) 
at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeDatabaseQuery(ObjectLevelReadQuery.java:997) 
at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:675) 
at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:958) 
at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:432) 
at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1021) 
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2863) 
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1225) 
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1207) 
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1181) 
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.executeReadQuery(EJBQueryImpl.java:453) 
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.getResultList(EJBQueryImpl.java:669) 
+0

你连接池设置,如果有的话? – Bozho 2010-02-21 07:12:49

回答

0

看来,数据库连接正由第一请求关闭,而第二请求检索从关闭连接池并失败。

你的数据源定义是什么样的?

+0

我刚刚添加了豆的定义 – nablik 2010-02-20 19:00:29

1

如果第一个例外转化为(我猜):

org.postgresql.util.PSQLException: An I/O error occured while sending to the backend. 

那么它很可能不是一个的EclipseLink问题,而是一个PostgreSQL的问题。

坐落在postgresql.conf服务器和重装以下几点:

log_statement=all 
log_min_error_statement=ERROR 
log_min_messages=ERROR 
log_connections=on 
log_disconnections=on 

然后检查服务器日志和更新与任何可疑消息(及附近几行)你的问题。

+0

我更改了postgresql.conf并重新启动了数据库服务器。然后我在我的应用程序中复制了错误,但在postgresql日志中没有发现任何可疑错误。只有关于查询,交易的信息 - 没有错误。 – nablik 2010-02-20 19:13:14

+0

我刚刚测试过mysql - >在相同的情况下出现错误,但是在这个数据库空指针上:/ – nablik 2010-02-20 19:23:29

+0

奇怪。什么是IMAGE字段?一个BLOB? – 2010-02-20 19:34:26