2016-11-19 3 views
3

Я переношу приложение из WAS7 в Liberty.Замена на WSCallHelper.clearStatementCache (connection) в websphere Профиль Liberty

Существующий код использует WSCallHelper.clearStatementCache(connection) в некоторых сценариях (пример: пакет не найден в случае вызовов процедур).

Я нашел WSCallHelper не существует на сервере свободы.

Не могли бы вы помочь мне с альтернативным решением для этого во свободе. Это может быть либо конкретная свобода, либо общий подход, который будет поддерживать все серверы.

ответ

1

Было бы полезно узнать больше о сценарии, где вам нужно позвонить WSCallHelper.clearStatementCache(connection), но на основе того, что вы описали, я буду предполагать, что он вызывается только по пути ошибки.

В Liberty нет API для программной очистки кэша операторов. Тем не менее, кешированные операторы будут сопоставляться только в том случае, если несколько свойств такие же, как: строка SQL, стойкость RS, схема, уровень изоляции и несколько других.

Почему вам не нужно clearStatementCache:
Пример сценария вы описали для вызова clearStatementCache, когда пакет не найден в БД, но пакет должен быть отражен в любой строке SQL или схемы. Поэтому, предполагая, что ваше приложение не повторяет неудачную строку SQL, вам не нужно вообще вызывать clearStatementCache.

Если вы действительно хотите, чтобы очистить кэш заявление:
Как определено в спецификации JDBC, заявления являются дочерними объектами соединения. Таким образом, творческий способ очистки кэша операторов состоит в том, чтобы избавиться от связи с плохими инструкциями. Вызов connection.close() может не выполнить этого, потому что соединения могут быть объединены сервером приложений, но вызов connection.abort() избавится от базового соединения и, следовательно, очистит кеш оператора.

1

Следует также отметить, что если вы хотите использовать более целенаправленный подход и иметь конкретный оператор, который вы хотите удалить из кеша (или никогда не заходить в кеш в первую очередь), вы можете использовать спецификацию JDBC API java.sql.Statement.setPoolable(false) . Вызовите это до закрытия дескриптора оператора. Сервер приложений не будет кэшировать операторы, отмеченные как poolable = false.

Смежные вопросы