Openfire: org.jivesoftware.openfire.pubsub.PubSubPersistenceManager - Неправильный синтаксис рядом с ключевым словом 'LEFT'

Любая идея, что может вызвать эту ошибку, постоянно появляется в all.log и error. журнал. Openfire 4.3.2 в Windows подключен к SQL Server 2012 (SP4) - хотя это не имеет значения. Может ли это быть результатом неправильного SQL в таблице ofProperty? Где смотреть? У нас есть работающее приложение чата в Интернете / Candy.js…

2019.05.08 20:46:12 ERROR [TaskEngine-pool-16]: org.jivesoftware.openfire.pubsub.PubSubPersistenceManager - Incorrect syntax near the keyword 'LEFT'.
java.sql.BatchUpdateException: Incorrect syntax near the keyword 'LEFT'.
    at net.sourceforge.jtds.jdbc.JtdsStatement.executeBatch(JtdsStatement.java:1069) ~[jtds-1.3.1.jar:1.3.1]
    at org.apache.commons.dbcp2.DelegatingStatement.executeBatch(DelegatingStatement.java:223) ~[commons-dbcp2-2.5.0.jar:2.5.0]
    at org.apache.commons.dbcp2.DelegatingStatement.executeBatch(DelegatingStatement.java:223) ~[commons-dbcp2-2.5.0.jar:2.5.0]
    at org.jivesoftware.openfire.pubsub.PubSubPersistenceManager.purgeItems(PubSubPersistenceManager.java:1893) [xmppserver-4.3.2.jar:4.3.2]
    at org.jivesoftware.openfire.pubsub.PubSubPersistenceManager.access$000(PubSubPersistenceManager.java:57) [xmppserver-4.3.2.jar:4.3.2]
    at org.jivesoftware.openfire.pubsub.PubSubPersistenceManager$2.run(PubSubPersistenceManager.java:283) [xmppserver-4.3.2.jar:4.3.2]
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_202]
    at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_202]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [?:1.8.0_202]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [?:1.8.0_202]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_202]
-1
задан 9 May 2019 в 00:00
1 ответ

Как показывает профилировщик SQL Server, Openfire пытается выполнить следующий SQL:

DELETE FROM ofPubsubItem
   LEFT JOIN (SELECT id FROM ofPubsubItem WHERE serviceID= @P0  AND nodeID= @P1  ORDER BY creationDate DESC LIMIT  @P2 ) AS noDelete
            ON ofPubsubItem.id = noDelete.id
WHERE noDelete.id IS NULL AND ofPubsubItem.serviceID =  @P3  AND nodeID =  @P4 ....'

Он неверен (или, по крайней мере, нестандартный оператор DELETE from join. Согласно ] https://stackoverflow.com/questions/4097260/sql-delete-based-on-condition-in-join , https://www.sqlservercentral.com/forums/topic/delete-statements -when-using-a-join-best-Practice и другие ресурсы, не существует стандарта ANSI SQL для удаления из соединения. Использование подзапросов вместо объединений всегда будет работать, но если вы хотите использовать соединение, обычно вам нужно включать ключевое слово FROM дважды, например:

DELETE FROM ofPubsubItem
  FROM ofPubsubItem LEFT JOIN (SELECT id FROM ofPubsubItem WHERE serviceID= @P0  AND nodeID= @P1  ORDER BY creationDate DESC LIMIT  @P2 ) AS noDelete
            ON ofPubsubItem.id = noDelete.id
WHERE noDelete.id IS NULL AND ofPubsubItem.serviceID =  @P3  AND nodeID =  @P4 ....'

Было бы неплохо, если бы разработчики Openfire исправили эту ошибку в следующем выпуске с исправлением ошибок.

0
ответ дан 5 December 2019 в 20:16

Теги

Похожие вопросы