Sun GlassFish Enterprise Server v3 发行说明

MySQL 的 EJB 计时器服务配置问题(问题 11428)

说明

能够以用户的身份在 MySQL 中创建和存储 EJB 计时器,但当尝试为 MySQL 配置 EJB 计时器服务时,出现以下异常(SQLException 执行语句):


"CREATE TABLE EJB__TIMER__TBL (TIMERID
VARCHAR(255) NOT NULL, BLOB BLOB(64000), INITIALEXPIRATIONRAW BIGINT, SCHEDULE
VARCHAR(255), INTERVALDURATION BIGINT, OWNERID VARCHAR(255), STATE INTEGER,
LASTEXPIRATIONRAW BIGINT, PKHASHCODE INTEGER, CREATIONTIMERAW BIGINT,
CONTAINERID BIGINT, PRIMARY KEY (TIMERID))":
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in
your SQL syntax; check the manual that corresponds to your MySQL server version
for the right syntax to use near 'BLOB BLOB(64000), INITIALEXPIRATIONRAW BIGINT,
SCHEDULE VARCHAR(255), INTERVALDU' at line 1|#] 

有关更多信息,请参见问题报告

解决方法

确保为计时器池指定的 datasource-classname 表示 XA 数据源。

MySQL 特定步骤:

  1. 解压缩 glassfishv3/glassfish/lib/install/applications/ejb-timer-service-app.war

  2. 将以下内容添加到 WEB-INF/classes/__ejb_timer_mappings.xml 中的 <persistence-unit-metadata> 之后:

    <persistence-unit-defaults>
    <delimited-identifiers/>
    </persistence-unit-defaults>
  3. 重新打包 WEB-INF/classes/__ejb_timer_mappings.xml 文件。

  4. (只有当前安装已使用 EJB 计时器服务时,才需要此步骤。)在数据库中使用此 create 语句手动创建 EJB__TIMER__TBL

    CREATE TABLE `EJB__TIMER__TBL` (`TIMERID` VARCHAR(255) NOT NULL,
    `BLOB` BLOB(64000), `INITIALEXPIRATIONRAW` BIGINT, `SCHEDULE` VARCHAR(255),
    `INTERVALDURATION` BIGINT, `OWNERID` VARCHAR(255), `STATE` INTEGER,
    `LASTEXPIRATIONRAW` BIGINT, `PKHASHCODE` INTEGER, `CREATIONTIMERAW` BIGINT,
    `CONTAINERID` BIGINT, PRIMARY KEY (`TIMERID`))