3

Glassfishが提供するタイマーサービスを利用しようとしています。EJB__TIMER__TBLしたがって、 Glassfishでjdbcリソースという名前のテーブルを作成し、構成する必要があります。

このテーブルを.という名前のスキーマのpostgreSQLに保存したいと思いますglassfish。だから私のddlはこれです(私はBLOBタイプをに置き換えますBYTEA):

CREATE SCHEMA glassfish;

CREATE TABLE glassfish.EJB__TIMER__TBL (
    CREATIONTIMERAW      BIGINT        NOT NULL,
    BLOB                 BYTEA,
    TIMERID              VARCHAR(255)  NOT NULL,
    CONTAINERID          BIGINT        NOT NULL,
    OWNERID              VARCHAR(255)  NULL,
    STATE                INTEGER       NOT NULL,
    PKHASHCODE           INTEGER       NOT NULL,
    INTERVALDURATION     BIGINT        NOT NULL,
    INITIALEXPIRATIONRAW BIGINT        NOT NULL,
    LASTEXPIRATIONRAW    BIGINT        NOT NULL,
    SCHEDULE             VARCHAR(255)  NULL,
    APPLICATIONID        BIGINT        NOT NULL,
    CONSTRAINT PK_EJB__TIMER__TBL PRIMARY KEY (TIMERID) 
);

DROP ROLE IF EXISTS glassfish;                      
CREATE ROLE glassfish WITH NOINHERIT LOGIN PASSWORD '...';
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA glassfish FROM glassfish;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA glassfish FROM glassfish;
GRANT USAGE ON SCHEMA glassfish TO glassfish;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA glassfish TO glassfish;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA glassfish TO glassfish;
GRANT USAGE ON ALL SEQUENCES IN SCHEMA glassfish TO glassfish;
ALTER USER glassfish SET search_path to 'glassfish';

Glassfish用にjdbcプールとリソースを構成しました。

asadmin create-jdbc-connection-pool 
--datasourceclassname org.postgresql.ds.PGConnectionPoolDataSource 
--restype javax.sql.ConnectionPoolDataSource 
--property User=glassfish:Password=...:PortNumber=5432:DatabaseName=...:ServerName=localhost jdbc/simPool/glassfish


asadmin create-jdbc-resource --connectionpoolid jdbc/simPool/glassfish jdbc/sim/glassfish

そしてjdbc/sim/glassfish、GlassishGUIのタイマーサービスに使用するjdbcリソースを適切に入力します。

アプリをデプロイするたびに、例外が発生します:

[#|2013-02-18T11:42:42.562+0100|WARNING|glassfish3.1.2|org.eclipse.persistence.session.file

:/E:/softs/serveurs/glassfish3_1122/glassfish/domains/domain1/applications/ejb-timer-service-app/WEB-INF/classes/___EJB__Timer__App|_ThreadID=58;_ThreadName=Thread-2;|Local Exception Stack: 
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: ERREUR: la relation « EJB__TIMER__TBL » n'existe pas
  Position : 193
Error Code: 0
Call: SELECT "TIMERID", "APPLICATIONID", "BLOB", "CONTAINERID", "CREATIONTIMERAW", "INITIALEXPIRATIONRAW", "INTERVALDURATION", "LASTEXPIRATIONRAW", "OWNERID", "PKHASHCODE", "SCHEDULE", "STATE" FROM "EJB__TIMER__TBL" WHERE (("OWNERID" = ?) AND ("STATE" = ?))
    bind => [2 parameters bound]
Query: 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" = ?))")
    at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:333)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:644)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:535)
    at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:1717)

そのため、GlassfishからテーブルEJB__TIMER__TBLにアクセスできないようです。

別のプロジェクトを作成persistence.xmlし、上記のプールされた接続と同じクレデンシャルでファイルを構成し、簡単なクエリを作成するとSELECT COUNT(*) FROM EJB__TIMER__TBL0接続が十分に確立され、アクセスされるデフォルトのスキーマがglassfish尊重されるようになります。

いくつ${glassfish_root}\glassfish\lib\install\databasesかのddlsがありますが、postgresqlにはどちらもありません...それで私はどこで間違っているのですか?

注意:MySQL jdbcリソースを使用してサービスタイマーを構成するためにテストすると、機能します...

手伝ってくれてありがとう

4

1 に答える 1

9

OK、問題の解決策を見つけました。

SQLができることを知りませんでしたcase sensitive。GlassfishはSELECT ... FROM "EJB__TIMER__TBL"二重引用符で呼び出すため、「ejb__timer__tbl」などではなく「EJB__TIMER__TBL」という名前のテーブルを作成する必要があります。

回避策は、二重引用符でテーブルを再作成することです。

CREATE TABLE glassfish."EJB__TIMER__TBL" (
"CREATIONTIMERAW"      BIGINT        NOT NULL,
"BLOB"                 BYTEA,
"TIMERID"              VARCHAR(255)  NOT NULL,
"CONTAINERID"          BIGINT        NOT NULL,
"OWNERID"              VARCHAR(255)  NULL,
"STATE"                INTEGER       NOT NULL,
"PKHASHCODE"           INTEGER       NOT NULL,
"INTERVALDURATION"     BIGINT        NOT NULL,
"INITIALEXPIRATIONRAW" BIGINT        NOT NULL,
"LASTEXPIRATIONRAW"    BIGINT        NOT NULL,
"SCHEDULE"             VARCHAR(255)  NULL,
"APPLICATIONID"        BIGINT        NOT NULL,
CONSTRAINT "PK_EJB__TIMER__TBL" PRIMARY KEY ("TIMERID") 
);
于 2013-02-18T13:52:19.977 に答える