PostgreSQL and Glassfish EJB__TIMER__TBL table

glassfish, postgresql, timer

Solution

Ok I found the solution of my problem.

I didn't know that SQL can be `case sensitive`. Glassfish calls `SELECT ... FROM "EJB__TIMER__TBL"` with double quotes so I have to create a table named "EJB__TIMER__TBL" not "ejb__timer__tbl" or anything else.

The workaround is just to recreate my table with double quotes :

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") 
);

Problem

I'm trying to use the timer service provided by Glassfish. Thus, I have to create a table named `EJB__TIMER__TBL` and configure jdbc resource in Glassfish. I want to store this table on postgreSQL on a schema named `glassfish`. So my ddl is this one (I replace the `BLOB` type to `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'; ``` I configured a jdbc pool and resource for Glassfish : ``` 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 ``` And I properly enter `jdbc/sim/glassfish` in the jdbc resource to use for timer service in Glassish GUI. Each time I deploy my app, I receive 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) ``` So my table `EJB__TIMER__TBL` doesn't seem to be accessible by Glassfish. When I create another project, configure a `persistence.xml` file with the same credentials as my pooled connexion above and create a simple query `SELECT COUNT(*) FROM EJB__TIMER__TBL`, I receive `0` so my connexion is well established and the default schema accessed is `glassfish` as espected. In `${glassfish_root}\glassfish\lib\install\databases` there is some ddls but neither for postgresql...so where am I doing wrong ? NB: when I test to configure service timer with MySQL jdbc resource, it's work... Thanks for help

Original source