Любая идея, что может вызвать эту ошибку, постоянно появляется в 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]
Как показывает профилировщик 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 исправили эту ошибку в следующем выпуске с исправлением ошибок.