Watching a new world…

February 17th, 2007

JBoss AS meckert: “Every derived table must have its own alias”

Probleme, Probleme, Probleme…
Beim Versuch den Enterprise Service Bus (ESB) von JBoss in den Griff zu bekommen stieß ich heute auf folgende Hürde: Beim Hochfahren meckert der JBoss-Server (JBoss AS 4.0.5, also topaktuell):

10:32:40,531 WARN [ServiceController] Problem starting service
jboss.mq:service=PersistenceManager
org.jboss.mq.SpyJMSException: Could not resolve uncommited transactions.
Message recovery may not be accurate; - nested throwable:
(com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Every derived table
must have its own alias)
at org.jboss.mq.pm.jdbc2….resolveAllUncommitedTXs(PersistenceManager.java:492)

at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
… at blablabla …
at org.jboss.Main$1.run(Main.java:490)
at java.lang.Thread.run(Thread.java:595)
Caused by: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException:
Every derived table must have its own alias
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2870)
… at blubber, sülz …
at org.jboss.resource.adapter.jdbc.WrappedPreparedStatement.
executeQuery(WrappedPreparedStatement.java:236)
at org.jboss.mq.pm.jdbc2.PersistenceManager.
resolveAllUncommitedTXs(PersistenceManager.java:424)
… 111 more

Nach einigen Nachforschungen hat sich herausgestellt, dass das folgende SQL-Statement von der MySQL-Datenbank hochnäsig zurückgewiesen wurde:

SELECT_MAX_TX = SELECT MAX(TXID) TXID FROM
(SELECT MAX(TXID) AS TXID FROM JMS_TRANSACTIONS
UNION SELECT MAX(TXID) AS TXID FROM JMS_MESSAGES)

Warum? Weil das Subselect offensichtlich auch einen Alias benötigt. Na von mir aus. Ein Schmökern in den JBoss-Foren und im JIRA hat mir auch nicht wirklich weitergeholfen. Beim Vergleich diverser User-Erfahrungen stellte sich herau, dass das Problem nicht auftritt, wenn man MySQL in einer Version größer als 4.0.13 und kleiner als 4.0.20 verwendet. Naja. Mit meiner brandheißen 5.0.27 bin ich da ja weit von entfernt. Im Bugtracker diskutieren die Entwickler lediglich die Frage, ob der Bug gefixt wird, dass er ja eigentlich schon gefixt ist, warum er dann nicht im Release ist, das das wohl vergessen wurde, ob er denn überhaupt gefixt werden muss, usw. usw…

Nun, die Lösung ist einfach:

Man schnappe sich die die Datei
[jboss.root]/server/default/deploy/jms/hsqldb-jdbc2-service.xml

und ändere diese Zeile:
SELECT_MAX_TX = SELECT MAX(TXID) TXID FROM
(SELECT MAX(TXID) AS TXID FROM JMS_TRANSACTIONS
UNION SELECT MAX(TXID) AS TXID FROM JMS_MESSAGES)

wie folgt ab:
SELECT_MAX_TX = SELECT MAX(TXID) TXID FROM
(SELECT MAX(TXID) AS TXID FROM JMS_TRANSACTIONS UNION
SELECT MAX(TXID) AS TXID FROM JMS_MESSAGES) AS ichbindergottverdammtealias

Nun erzählt mir mein lieber JBoss Server noch dass die Tabelle JMS_TRANSACTIONS nicht existiert. Also in der selben Datei nochmal kurz gepatcht. Folgende Zeilen:

CREATE_MESSAGE_TABLE =
CREATE CACHED TABLE JMS_MESSAGES ( MESSAGEID INTEGER NOT NULL,
DESTINATION VARCHAR(255) NOT NULL, TXID INTEGER, TXOP CHAR(1),
MESSAGEBLOB OBJECT, PRIMARY KEY (MESSAGEID, DESTINATION) )
CREATE_TX_TABLE = CREATE CACHED
TABLE JMS_TRANSACTIONS ( TXID INTEGER, PRIMARY KEY (TXID) )

ändern zu:
CREATE_MESSAGE_TABLE =
CREATE TABLE JMS_MESSAGES ( MESSAGEID INTEGER NOT NULL,
DESTINATION VARCHAR(255) NOT NULL, TXID INTEGER, TXOP CHAR(1),
MESSAGEBLOB BLOB, PRIMARY KEY (MESSAGEID, DESTINATION) )
CREATE_TX_TABLE = CREATE TABLE JMS_TRANSACTIONS ( TXID INTEGER, PRIMARY KEY (TXID) )

Nun ist Ruhe.

5 Responses to “JBoss AS meckert: “Every derived table must have its own alias””

empi said:

Hmmm,
also Dein Patch hat gewirkt! Danke vielmals an dieser Stelle.

Die Große Frage, die ich mir stelle ist:
Warum ist das Problem plötzlich aufgetreten, nachdem ich den JBoss neu installiert habe und ist beim letzten mal nicht aufgetreten?

Gruß
empi

April 25th, 2007 at 11:07

Oliver Meimberg said:

Vielleicht die MySQL-Version geändert? Ich glaube MySQL war da in früheren Versionen toleranter…

April 25th, 2007 at 02:07

Tobias Mueller said:

Wenn man unter server/servername/deploy/jms die hsqldb-jdbc-service.xml durch die mysql-jdbc2-service.xml aus den examples ersetzt, und diese dann noch auf DefaultDS editiert klappt es auch.

April 28th, 2007 at 04:44

Oliver Meimberg said:

Okay, gut zu wissen, klingt einfacher ;)

April 30th, 2007 at 10:27

Christian said:

Guckst du auch hier:

http://wiki.jboss.org/wiki/Wiki.jsp?page=SetUpAMysqlDatasource

May 30th, 2007 at 04:40

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

klipal online pharmacy buy online cialis viagra online xanax cream for women order zyban online oxazepam buy alternative erection lorazepam cheap drugs 2003 tramadol tramadol market sales tramadol rx pills diazepam discount retail alternative to valium at gnc online drugstore tenuate order order levitra discount cialis buy the cheapest propecia online cheapest generic viagra online drugstore order cialis soft tabs over internet need no doctor cheapest levitra prices woman viagra soft tabs natural substitutes for viagra soft tabs online viagra natural levitra substitutes female cialis alternative