问题:PostgreSQL 和 Glassfish EJB__TIMER__TBL 表

我正在尝试使用 Glassfish 提供的计时器服务。因此,我必须创建一个名为EJB__TIMER__TBL的表并在 Glassfish 中配置 jdbc 资源。

我想将此表存储在名为glassfish的模式上的 postgreSQL 上。所以我的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 资源中正确输入jdbc/sim/glassfish以用于 Glassish GUI 中的计时器服务。

每次我部署我的应用程序时,我都会收到 Exception :

[#|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__TBL,我收到0,因此我的连接已经建立,并且访问的默认模式是glassfish,如预期的那样。

${glassfish_root}\glassfish\lib\install\databases中有一些 ddls,但对于 postgresql 都没有......所以我在哪里做错了?

注意:当我测试使用 MySQL jdbc 资源配置服务计时器时,它的工作...

感谢帮助

解答

好的,我找到了我的问题的解决方案。

我不知道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") 
);
Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐