2010-02-20 47 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