Glassfish EJB Timer服务与只读或锁定的Derby数据库有关

mau*_*man 1 installation ejb glassfish derby

我有两个Solaris服务器,每个服务器都安装了Glassfish 3.1.1(Build 12)和Java 1.6.0_27.Glassfish服务器似乎功能齐全,但我无法部署利用EJB Timer Service的应用程序.默认情况下,Timer Service依赖于在默认"__TimerPool"连接池中创建的表"EJB_ TIMER _TBL"来存储状态信息.在一台服务器上,错误是:

java.sql.SQLException:对于只读连接,用户或数据库,不允许更改SQL数据.

在另一台服务器上,错误是:

ERROR 40XL1:在请求的时间内无法获得锁定

我原以为这个问题与文件权限有关.但是我已经查看了Java和Glassfish安装的文件权限和所有权,包括"domains/domain1/lib/databases/ejbtimer"下的derby数据库文件,它们与我没有遇到此问题的其他Solaris服务器上的相同.

您是否有任何想法会导致Derby数据库在全新的Glassfish和Java安装中"只读"或"锁定"? 我知道这里可能有两个不同的原因,但是两个服务器上的相同安装步骤同时出现了两个原因.

以下是Glassfish server.log的堆栈跟踪的更多部分:

锁定堆栈:

[#| 2011-10-07T17:35:21.739 + 0000 |警告| glassfish3.1.1 | javax.enterprise.system.container.ejb.com.sun.ejb.containers | _ThreadID = 10; _ThreadName =线程2; | EJB5108:无法初始化EJB Timer Service.可能的原因是未正确配置计时器资源,尚未启动数据库,或尚未创建计时器数据库表.来自com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5091)的com.sun.ejb.containers.BaseContainer.processSystemException(BaseContainer.java:5193)中的javax.ejb.EJBException ...

通过引起:异常[的EclipseLink-4002](Eclipse持久服务- 2.3.0.v20110604-r9504):org.eclipse.persistence.exceptions.DatabaseException内部异常:java.sql.SQLTransactionRollbackException:一个锁不能的时间内获得请求错误代码:30000电话:SELECT "的timerId", "的applicationID", "BLOB", "数据筒", "CREATIONTIMERAW", "INITIALEXPIRATIONRAW", "INTERVALDURATION", "LASTEXPIRATIONRAW", "OWNERID", "PKHASHCODE","时间表","状态"来自"EJB_ TIMER _TBL"WHERE(("OWNERID"=?)AND("STATE"=?))bind => [2个参数绑定]查询:ReadAllQuery(name ="findTimersByOwnerAndState"referenceClass = TimerState sql ="SELECT "的timerId", "的applicationID", "BLOB", "数据筒", "CREATIONTIMERAW", "INITIALEXPIRATIONRAW", "INTERVALDURATION", "LASTEXPIRATIONRAW", "OWNERID", "PKHASHCODE", "SCHEDULE", "STATE" FROM "EJB_ TIMER _TBL" WHERE(( "OWNERID"=?)AND( "国家"=?))")在org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java :333)org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:644)...

引发者:java.sql.SQLException:在org.apache.derby.impl.jmplc.SQLExceptionFactory40的org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(未知来源)请求的时间内无法获得锁定. ERROR 40XL1:wrapArgsForTransportAcrossDRDA(来源不明)... 95多由造成锁无法在org.apache.derby.iapi.error.StandardException.newException(来源不明)在org.apache.derby请求的时间内获得位于org.apache.derby.impl.services.locks.AbstractPool.zeroDurationlockObject的org.apache.derby.impl.services.locks.ConcurrentLockSet.zeroDurationLockObject(未知来源)的.impl.services.locks.ConcurrentLockSet.lockObject(未知来源) (未知来源)......

只读堆栈:

[#| 2011-10-07T18:35:43.498 + 0000 |警告| glassfish3.1.1 | javax.enterprise.system.container.web.com.sun.enterprise.web | _ThreadID = 20; _ThreadName =线程2; | StandardWrapperValve [jsp]:PWC1406:Servlet jsp的Servlet.service()抛出异常javax.ejb.EJBException:事务在com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5120)中止...

引起:javax.transaction.RollbackException:标记为回滚的事务.在com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:479)在com.sun.enterprise.transaction.JavaEETransactionManagerSimplified.commit(JavaEETransactionManagerSimplified.java:852)在com.sun.ejb.containers.BaseContainer.completeNewTx (BaseContainer.java:5114)...... 65多产生的原因:异常[的EclipseLink-4002](Eclipse持久服务- 2.3.0.v20110604-r9504):org.eclipse.persistence.exceptions.DatabaseException内部异常:的java.sql .SQLException:对于只读连接,用户或数据库,不允许更改SQL数据.错误代码:20000电话:INSERT INTO "EJB_ TIMER _TBL"( "的timerId", "的applicationID", "BLOB", "数据筒", "CREATIONTIMERAW", "INITIALEXPIRATIONRAW", "INTERVALDURATION", "LASTEXPIRATIONRAW", "OWNERID" "PKHASHCODE","SCHEDULE","STATE")VALUES(?,?,?,?,?,?,?,?,?,?,?,?)bind => [12个参数绑定]查询:InsertObjectQuery( com.sun.ejb.containers.TimerState@75d8af)org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:324)org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java: 840)在org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:906)...

引发者:java.sql.SQLException:对于只读连接,用户或数据库,不允许更改SQL数据.在org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(来源不明)在org.apache.derby.impl.jdbc.Util.generateCsSQLException(来源不明)在org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException (未知来源)......

Mik*_*van 5

我有相同的情况与Error Code: 20000 Call: INSERT INTO EJB__TIMER__TBL ...上面提到的相同的错误消息()(我无法使用EJB计时器部署ear包)所以我检查了我的运行

glassfish_directory_domains/my_domain/lib/databases/ejbtimer 目录.

在列出它的内容之后,我在这个目录中看到了一个重要的事情:不知何故,db.lck文件是在root下创建的(也许是我上次使用sudo意外启动域)所以我为这个目录中的所有文件及其子目录做了chown和chgrp(当然,在这项工作中,glassfish域名被停止了).

之后,一切都再次完美.我的ear package部署成功了.

感谢合作思考:-)