summaryrefslogtreecommitdiffstats
path: root/documentation/sqlcontainer/sqlcontainer-caching.asciidoc
diff options
context:
space:
mode:
Diffstat (limited to 'documentation/sqlcontainer/sqlcontainer-caching.asciidoc')
-rw-r--r--documentation/sqlcontainer/sqlcontainer-caching.asciidoc119
1 files changed, 119 insertions, 0 deletions
diff --git a/documentation/sqlcontainer/sqlcontainer-caching.asciidoc b/documentation/sqlcontainer/sqlcontainer-caching.asciidoc
new file mode 100644
index 0000000000..c93a012fa5
--- /dev/null
+++ b/documentation/sqlcontainer/sqlcontainer-caching.asciidoc
@@ -0,0 +1,119 @@
+---
+title: Caching, Paging and Refreshing
+order: 5
+layout: page
+---
+
+[[sqlcontainer.caching]]
+= Caching, Paging and Refreshing
+
+To decrease the amount of queries made to the database, SQLContainer uses
+internal caching for database contents. The caching is implemented with a
+size-limited [classname]#LinkedHashMap# containing a mapping from
+[classname]#RowId#s to [classname]#RowItem#s. Typically developers do not need
+to modify caching options, although some fine-tuning can be done if required.
+
+[[sqlcontainer.caching.container-size]]
+== Container Size
+
+The [classname]#SQLContainer# keeps continuously checking the amount of rows in
+the connected database table in order to detect external addition or removal of
+rows. By default, the table row count is assumed to remain valid for 10 seconds.
+This value can be altered from code; with
+[methodname]#setSizeValidMilliSeconds()# in [classname]#SQLContainer#.
+
+If the size validity time has expired, the row count will be automatically
+updated on:
+
+* A call to [methodname]#getItemIds()# method
+
+* A call to [methodname]#size()# method
+
+* Some calls to [methodname]#indexOfId(Object itemId)# method
+
+* A call to [methodname]#firstItemId()# method
+
+* When the container is fetching a set of rows to the item cache (lazy loading)
+
+
+
+[[sqlcontainer.caching.page-length]]
+== Page Length and Cache Size
+
+The page length of the [classname]#SQLContainer# dictates the amount of rows
+fetched from the database in one query. The default value is 100, and it can be
+modified with the [methodname]#setPageLength()# method. To avoid constant
+queries it is recommended to set the page length value to at least 5 times the
+amount of rows displayed in a Vaadin [classname]#Table#; obviously, this is also
+dependent on the cache ratio set for the [classname]#Table# component.
+
+The size of the internal item cache of the [classname]#SQLContainer# is
+calculated by multiplying the page length with the cache ratio set for the
+container. The cache ratio can only be set from the code, and the default value
+for it is 2. Hence with the default page length of 100 the internal cache size
+becomes 200 items. This should be enough even for larger [classname]#Table#s
+while ensuring that no huge amounts of memory will be used on the cache.
+
+
+[[sqlcontainer.caching.refreshing]]
+== Refreshing the Container
+
+Normally, the [classname]#SQLContainer# will handle refreshing automatically
+when required. However, there may be situations where an implicit refresh is
+needed, for example, to make sure that the version column is up-to-date prior to
+opening the item for editing in a form. For this purpose a
+[methodname]#refresh()# method is provided. This method simply clears all
+caches, resets the current item fetching offset and sets the container size
+dirty. Any item-related call after this will inevitably result into row count
+and item cache update.
+
+__Note that a call to the refresh method will not affect or reset the following
+properties of the container:__
+
+* The [classname]#QueryDelegate# of the container
+* Auto-commit mode
+* Page length
+* Filters
+* Sorting
+
+
+ifdef::web[]
+[[sqlcontainer.caching.flush-notification]]
+== Cache Flush Notification Mechanism
+
+Cache usage with databases in multiuser applications always results in some kind
+of a compromise between the amount of queries we want to execute on the database
+and the amount of memory we want to use on caching the data; and most
+importantly, risking the cached data becoming stale.
+
+SQLContainer provides an experimental remedy to this problem by implementing a
+simple cache flush notification mechanism. Due to its nature these notifications
+are disabled by default but can be easily enabled for a container instance by
+calling [methodname]#enableCacheFlushNotifications()# at any time during the
+lifetime of the container.
+
+The notification mechanism functions by storing a weak reference to all
+registered containers in a static list structure. To minimize the risk of memory
+leaks and to avoid unlimited growing of the reference list, dead weak references
+are collected to a reference queue and removed from the list every time a
+[classname]#SQLContainer# is added to the notification reference list or a
+container calls the notification method.
+
+When a [classname]#SQLContainer# has its cache notifications set enabled, it
+will call the static [methodname]#notifyOfCacheFlush()# method giving itself as
+a parameter. This method will compare the notifier-container to all the others
+present in the reference list. To fire a cache flush event, the target container
+must have the same type of [classname]#QueryDelegate# (either
+[classname]#TableQuery# or [classname]#FreeformQuery#) and the table name or
+query string must match with the container that fired the notification. If a
+match is found the [methodname]#refresh()# method of the matching container is
+called, resulting in cache flushing in the target container.
+
+__Note: Standard Vaadin issues apply; even if the [classname]#SQLContainer# is
+refreshed on the server side, the changes will not be reflected to the UI until
+a server round-trip is performed, or unless a push mechanism is used.__
+
+endif::web[]
+
+
+