вторник, июля 06, 2010

Glassfish, Spring, и RAR5031:System Exception

Приложение имеет следующий простой вид: EJB SLSB фасад, который обращается с контексту Спринга, получает из него реализацию сервиса и делегирует вызов этом полученному сервису.

В ряде совершенно вроде бы безобидных случаев вываливался exception, начинающийся вот так:

RAR5031:System Exception.
java.lang.NullPointerException
at com.sun.enterprise.resource.ConnectorXAResource.getResourceHandle(ConnectorXAResource.java:228)
at com.sun.enterprise.resource.ConnectorXAResource.start(ConnectorXAResource.java:124)
at com.sun.enterprise.distributedtx.J2EETransactionManagerOpt.enlistResource(J2EETransactionManagerOpt.java:159)
at com.sun.enterprise.resource.ResourceManagerImpl.registerResource(ResourceManagerImpl.java:144)
at com.sun.enterprise.resource.ResourceManagerImpl.enlistResource(ResourceManagerImpl.java:102)
at com.sun.enterprise.resource.PoolManagerImpl.getResource(PoolManagerImpl.java:216)
at com.sun.enterprise.connectors.ConnectionManagerImpl.internalGetConnection(ConnectionManagerImpl.java:327)
at com.sun.enterprise.connectors.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:189)
at com.sun.enterprise.connectors.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:165)
at com.sun.enterprise.connectors.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:158)
at com.sun.gjc.spi.base.DataSource.getConnection(DataSource.java:108)
at org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider.getConnection

Случаи были совсем безобидные - вида (автоматического, разумеется) обращения к БД для генерации идентификатора (через TableGenerator) или в случае вызова тразакционного спрингового компонента из транзакционного же EJB SLSB... Короче, во всех этих случаях ничего ломаться бы и не должно было - но ломалось.

Стэктрейс в этой ситуации был реально большим, вот здесь я оставил из него только классы исключений, убрав имена и адреса методов

RAR5031:System Exception.
java.lang.NullPointerException

RAR5031:System Exception.
com.sun.enterprise.resource.PoolingException: java.lang.NullPointerException
RAR5029:Unexpected exception while registering component.
java.lang.RuntimeException: Got exception during XAResource.start:
poolmgr.err_enlisting_res_in_getconn
RAR5117 : Failed to obtain/create connection from connection pool [ ]. Reason : java.lang.RuntimeException: Got exception during XAResource.start:
RAR5114 : Error allocating connection : [Error in allocating a connection. Cause: java.lang.RuntimeException: Got exception during XAResource.start:]

--In J2EETransaction.rollback, jtsTx=null nonXAResource=null
ejbDestroyed: BookServiceBean; id: [B@159b1a0
--In J2EETransaction.rollback, jtsTx=null nonXAResource=75
context with empty container in ContainerSynchronization.afterCompletion
EJB5018: An exception was thrown during an ejb invocation on [BookServiceBean]

javax.ejb.EJBException
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Cannot open connection
Caused by: org.hibernate.exception.GenericJDBCException: Cannot open connection
Caused by: java.sql.SQLException: Error in allocating a connection. Cause: java.lang.RuntimeException: Got exception during XAResource.start:
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Cannot open connection
Caused by: org.hibernate.exception.GenericJDBCException: Cannot open connection
Caused by: java.sql.SQLException: Error in allocating a connection. Cause: java.lang.RuntimeException: Got exception during XAResource.start:
Caused by: java.rmi.RemoteException: null; nested exception is:
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Cannot open connection
Caused by: org.hibernate.exception.GenericJDBCException: Cannot open connection
Caused by: java.sql.SQLException: Error in allocating a connection. Cause: java.lang.RuntimeException: Got exception during XAResource.start:
javax.ejb.EJBException: nested exception is: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.RemoteException: null; nested exception is:
javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Cannot open connection

Проблема оказалась в следующем: не было установлено свойство allow-non-component-callers в описании пула соединений. После того, как свойство это установил - все проблемы кончились.

К слову, документация по этому поводу сообщает:
You can allow non-Java-EE components, such as servlet filters and third party persistence managers, to use this JDBC connection pool. The returned connection is automatically enlisted with the transaction context obtained from the transaction manager. Standard Java EE components can also use such pools. Connections obtained by non-component callers are not automatically closed at the end of a transaction by the container. They must be explicitly closed by the caller.

Комментариев нет: