Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
jdbc: support server prepared statements
Tarantool supports prepared statements since 2.3.1 that can be used by java.sql.PreparedStatement to prepare the underlying query in advance. If the driver connects to Tarantool which support prepared the statements each PreparedStatement object acts as a corresponding server prepared statement in terms of its behaviour (including expiration or invalidation of statements - i.e. after DML operations). It also makes possible to obtain statement meta data via getMetaData and getParameterMetaData without having to execute the query. This commit extends TarantoolConnection API by new `prepare` and `deallocate` methods that allow to deal with server prepared statements. It caused a small reworking of a query execution process in SQLConnection where QueryCommand abstraction was introduced. Another extension is support of PreparedStatement works in two different modes: legacy mode when prepared statements are not available (driver will send sql text + parameters as a separate queries when each execution is performed) and new mode when they are (each PreparedStatement covers the server prepared statement and sends statement id + parameters). There are a few issues when using the prepared statement now. The first, it is required to deallocate prepared statements explicitly, (no an eviction strategy on the server side) so PreparedStatement tries to perform it when close() is called. It causes next issue. The second, Tarantool does not distinguish query duplicates within one session that can cause unexpected user experience. Let's say there are two PreparedStatements that were prepared using the same query string. If one of them closes it makes another statement broken because of they reused the same session prepared statement. To overcome this issue the driver connection tracks its own statements references. When the particular statement reference count reaches zero it will safely unprepared on the server side. The third, the prepared statement is invalidated by DDL queries or the disconnection. Here, the PreparedStatement repeats behaviour of structure implemented in LUA (box.prepare()) - return an error when it runs. Tarantool does not support auto re-preparing after DDL operation at this moment. Closes: #198
- Loading branch information