【问题标题】:Glassfish EJB Timer Service issues with Read-Only or Locked Derby Database [closed]Glassfish EJB 计时器服务与只读或锁定的 Derby 数据库有关的问题 [关闭]
【发布时间】:2011-10-10 13:05:41
【问题描述】:

我有两台 Solaris 服务器,每台服务器都安装了 Glassfish 3.1.1(Build 12)和 Java 1.6.0_27。 Glassfish 服务器似乎功能齐全,但我无法部署利用 EJB 计时器服务的应用程序。默认情况下,计时器服务依赖于在默认“__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=Thread- 2;|EJB5108: 无法初始化 EJB 定时器服务。可能的原因是定时器资源配置不正确,数据库没有启动,或者定时器数据库表没有创建。 javax.ejb.EJBException 在 com.sun.ejb.containers.BaseContainer.processSystemException(BaseContainer.java:5193) 在 com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5091) ...

原因:异常 [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException 内部异常:java.sql.SQLTransactionRollbackException:在请求的时间内无法获得锁 错误代码:30000 调用:选择“TIMERID”、“APPLICATIONID”、“BLOB”、“CONTAINERID”、“CREATIONTIMERAW”、“INITIALEXPIRATIONRAW”、“INTERVALDURATION”、“LASTXPIRATIONRAW”、“OWNERID”、“PKHASHCODE”、“SCHEDULE”、“STATE” FROM "EJB_TIMER_TBL" WHERE (("OWNERID" = ?) AND ("STATE" = ?)) bind => [绑定2个参数] 查询:ReadAllQuery(name="findTimersByOwnerAndState" referenceClass=TimerState sql="SELECT "TIMERID", "APPLICATIONID", "BLOB", "CONTAINERID", "CREATIONTIMERAW", "INITIALEXPIRATIONRAW", "INTERVALDURATION", "LASTEXPIRATIONRAW", "OWNERID ", "PKHASHCODE", "SCHEDULE", "STATE" FROM "EJB_TIMER_TBL" WHERE (("OWNERID" = ?) AND ("STATE" = ?))") 在 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.jdbc.SQLExceptionFactory.getSQLException(未知来源) 在 org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(未知来源) ... 95 更多 原因:ERROR 40XL1:在请求的时间内无法获得锁 在 org.apache.derby.iapi.error.StandardException.newException(未知来源) 在 org.apache.derby.impl.services.locks.ConcurrentLockSet.lockObject(未知来源) 在 org.apache.derby.impl.services.locks.ConcurrentLockSet.zeroDurationLockObject(未知来源) 在 org.apache.derby.impl.services.locks.AbstractPool.zeroDurationlockObject(未知来源) ...

只读堆栈:

[#|2011-10-07T18:35:43.498+0000|警告|glassfish3.1.1|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=20;_ThreadName=Thread- 2;|StandardWrapperValve[jsp]: PWC1406: Servlet.service() for servlet jsp 抛出异常 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 Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException 内部异常:java.sql.SQLException:只读连接、用户或数据库不允许更改 SQL 数据。 错误代码:20000 调用:插入到“EJB_TIMER_TBL”(“TIMERID”、“APPLICATIONID”、“BLOB”、“CONTAINERID”、“CREATIONTIMERAW”、“INITIALEXPIRATIONRAW”、“INTERVALDURATION”、“LASTEXPIRATIONRAW”、“ OWNERID", "PKHASHCODE", "SCHEDULE", "STATE") 值 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 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(未知来源) ...

【问题讨论】:

    标签: installation glassfish ejb derby


    【解决方案1】:

    我遇到了同样的情况,上面提到了同样的错误消息 (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 部署成功。

    感谢合作思考:-)

    【讨论】:

      【解决方案2】:

      Derby 数据库可以是只读的,因为它们已安装在只读介质(例如 CD-ROM)上。它们也可以是只读的,因为它们存储在 jar 或 zip 文件中,并且可以直接从该 jar/zip 访问。以下是更多信息:http://db.apache.org/derby/docs/10.8/devguide/cdevdeploy15325.html

      【讨论】:

      • 此 derby 数据库不是只读的。它是嵌入在 Glassfish 中的。在一个系统上,我们更改了计时器以使用除 Derby 之外的不同数据库。另一方面,我们似乎遇到了持久计时器(默认设置)的问题。我们将它们更改为不持久,并且从那时起在 Derby 数据库上运行的计时器没有问题。幸运的是,我们不需要他们坚持不懈。
      【解决方案3】:

      我在使用相同的堆栈跟踪时遇到了同样的问题。问题是由 glassfish 管理员密码引起的。我不得不更改它以应用 ssl 证书。更改密码后出现错误消息。

      我通过重置 glassfish 密码解决了这个问题。

      Remove password examples

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-16
        • 2010-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-20
        相关资源
        最近更新 更多