Лучший способ решить конфликт между EclipseLink @Version Timestamp-Field и DB2 - PullRequest
0 голосов
/ 11 июня 2019

В текущем проекте, над которым я работаю, мы используем EclipseLink в качестве JPA-провайдера .На заднем плане - база данных DB2 .
Мы хотим ввести "Оптимистическую блокировку" только с ограничением , используя поля отметок времени .Кроме того, эти поля отметок времени являются полями CURRENT TIMESTAMP, поэтому при обновлении объекта поле CURRENT TIMESTAMP обновляет само значение.Это необходимо для обеспечения надежности всей системы.

При аннотировании атрибута сущности с помощью @Version я получаю следующее сообщение об ошибке:

Внутреннее исключение: ком.ibm.websphere.ce.cm.StaleConnectionException: ЗАЯВЛЕНИЕ SQL НЕ ПОДДЕРЖИВАЕТСЯ.SQLCODE = -142, SQLSTATE = 42612, DRIVER = 4.22.29
Код ошибки: -142
Вызов: VALUES CURRENT TIMESTAMP
Запрос: ValueReadQuery (sql = "VALUES CURRENT TIMESTAMP") в
org**

Примечание. Это сообщение об ошибке появляется только при использовании упомянутой аннотации.

Мое исследование привело к следующему:

  1. Внутреннее исключение : com.ibm.websphere.ce.cm.StaleConnectionException: -> AStaleConnectionException - это исключение, которое генерируется кодом соединения с базой данных WebSphere Application Server, когда драйвер JDBC возвращает фатальную ошибку из запроса или операции соединения.В WebSphere Application Server исключение StaleConnectionException выдается, когда поставщик базы данных выдает исключение, указывающее, что соединение, находящееся в данный момент в пуле соединений, больше не является допустимым.(https://developer.ibm.com/answers/questions/205910/how-to-resolve-the-staleconnectionexception-in-web/)
  2. ЗАЯВЛЕНИЕ SQL НЕ ПОДДЕРЖИВАЕТСЯ.SQLCODE = -142, -> Обнаружен оператор SQL, который не поддерживается базой данных .Оператор может быть действительным для других продуктов реляционных баз данных IBM® или может быть действительным в другом контексте .Например, операторы , такие как VALUES и SIGNAL или RESIGNAL SQLSTATE, могут использоваться только в определенных контекстах, например в теле триггера или в процедуре SQL.(https://www.ibm.com/support/knowledgecenter/en/SSEPEK_10.0.0/codes/src/tpc/n142.html)
  3. SQLSTATE = 42612,
    -> Кажется внутренним, ничего для моей значимости

После того, как я углублюсь в тему, янаткнулся на следующую ссылку, которая кажется наиболее обнадеживающей на данный момент:
https://www.idug.org/p/fo/et/thread=36380
Таким образом, предлагаемый способ заключается в расширении org.eclipse.persistence.platform.database.DB2MainframePlatform и манипулированиисгенерированный SQL-оператор.

Я ожидаю, что должен быть лучший способ, поскольку это должен быть стандартный случай для фреймворка.Если нет, есть ли более правильный / лучший способ решить эту проблему?

...