2011-10-10 34 views
1

我有兩臺Solaris服務器,每臺服務器都安裝了Glassfish 3.1.1(Build 12)和Java 1.6.0_27的全新安裝。 Glassfish服務器似乎功能齊全,但我無法部署利用EJB定時服務的應用程序。默認情況下,定時服務取決於在默認的「__TimerPool」連接池內創建的表「EJB_ TIMER _TBL」以存儲狀態信息。在一臺服務器上,錯誤是:使用只讀或鎖定Derby數據庫的Glassfish EJB計時器服務問題

java.sql.SQLException:對於只讀連接,用戶或數據庫,不允許SQL數據更改。

在其他服務器,錯誤的是:

錯誤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持久服務 - 2.3.0.v20110604-r9504):org.eclipse.persistence.exceptions.DatabaseException 內部異常:java.sql.SQLTransactionRollbackException:一個鎖不能在請求的時間內獲得 錯誤代碼:30000 調用:SELECT「TIMERID」,「APPLICATIONID」,「BLOB」,「CONTAINERID」,「CREATIONTIMERAW」,「INITIALPRIATIONRAW」,「INTERVALDURATION」,「LASTEXPIRATIONRAW」,「OWNERID」 ,「PKHASHCODE」,「 「(」OWNERID「=?)和(」STATE「=?) bind => [2參數綁定] 查詢:ReadAllQuery(name =」findTimersByOwnerAndState 「referenceClass = TimerState sql =」SELECT「TIMERID」,「APPLICATIONID」,「BLOB」,「CONTAINERID」,「CREATIONTIMERAW」,「INITIALEXPIRATIONRAW」,「INTERVALDURATION」,「LASTEXPIRATIONRAW」,「OWNERID」,「PKHASHCODE」,「SCHEDULE 「(」OWNERID「=?)和(」STATE「=?))」)「STATE」FROM「EJB_ TIMER _TBL」) at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java :333) at 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(Unknown Source) ... 95更多 錯誤40XL1:在請求的時間內無法獲得鎖定 at org.apache.derby.iapi.error.StandardException.newException(未知源) at org.apache.derby.impl.services.locks.ConcurrentLockSet.lockObject(Unknown Source) at org.apache.derby.impl.services.locks.ConcurrentLockSet.zeroDurationLockObject(Unknown Source) 在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 =線程2; | StandardWrapperValve [jsp]:PWC1406:Servlet .service()對於servlet jsp拋出異常 javax.ejb.EJBException:事務中止 at 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 => [ ] 查詢:InsertObjectQuery([email protected]) at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:324) at org.eclipse.persistence.internal.databaseaccess。 DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:840) at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:906) ...

導致:java.sql.SQLException:SQL數據更改不允許用於只讀連接,用戶或數據庫。 at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source) at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source) at org.apache.derby.impl.jdbc。 TransactionResourceImpl.wrapInSQLException(來源不明) ...

回答

1

Derby數據庫可以只讀的,因爲它們已被安裝在只讀媒體如CD-ROM光盤。它們也可以是隻讀的,因爲它們存儲在jar或zip文件中,並直接從jar/zip中訪問。這裏的一些信息:http://db.apache.org/derby/docs/10.8/devguide/cdevdeploy15325.html

+0

這個德比數據庫不是隻讀的。這是嵌入Glassfish。在一個系統上,我們將定時器更改爲使用除Derby以外的其他數據庫。在另一個我們似乎有持續定時器(默認)這個問題。我們將它們更改爲不持久,並且自從在Derby數據庫上運行計時器時沒有問題。幸運的是,我們並不需要他們持久。 – mauman

5

我曾與上面提到的相同的錯誤消息(Error Code: 20000 Call: INSERT INTO EJB__TIMER__TBL ...)相同的情況下(我是不能夠使用EJB計時器部署耳包),所以我已經檢查了我的跑步

glassfish_directory_domains/my_domain/lib/databases/ejbtimer目錄。

而且我在此目錄中列出它的內容後,看到一件重要的事情:不知何故db.lck文件在根目錄中創建(也許是我最後一次使用sudo意外啓動域),所以我做了chown和chgrp命令在這所有文件目錄及其子目錄(當然,在此工作中,glassfish域會被停止)。

之後,一切都完美了。我的ear package已成功部署。

感謝您的合作思維:-)

0

我有相同的堆棧跟蹤同樣的問題。問題是由glassfish管理員密碼造成的。我不得不改變它來申請一個SSL證書。在我更改密碼後,出現了錯誤信息。

我通過重置glassfish密碼解決了這個問題。

Remove password examples