I made a simple testcase that shows that LOB_TIMEOUT is not working.
See the attachment. Testcase creates an in-memory db with table with clob column, inserts 2048 records with 1MB clob. After GC, heap is at 2.2GB. Selecting test table for 5000 times increases heap to 4.2GB. After LOB_TIMEOUT=5s nothing happens. Closing connection helps somehow, but maybe because of other reasons.
Tested mainly on v2.1.212, but also on 2.1.214, and 1.4.199.
Looking at H2 code, resultset LOBs get registered to LobStorageMap#pendingLobRemovals. These are removed in LobStorageMap.cleanup(). This method is called from MVStore.notifyCleaner(), and this one from MVStore.closeStore() and from MVStore.notifyAboutOldestVersion(). The notifyAboutOldestVersion() starts with if containing the 'bufferSaveExecutor != null' condition. But bufferSaveExecutor is only set to non-null value in setAutoCommitDelay(millis) where millis>0. Debugger shows it as null, so cleanup isnt executed.
Am I right?
Teporary solution was to set MAX_LENGTH_INPLACE_LOB=<max lob size>. I assume for in-memory DBs high MAX_LENGTH_INPLACE_LOB values are ok. This solves the heap issues, and makes inserts and selects much much faster. In is also easily applicable, no code fixes, just url update.
Thank you, H2 is still great!