If the client creates a result set containing LOB locator columns and iterates through it without actually accessing the LOB columns, the locators are not released.
The amount of locators and their associated LOB objects causes the server to consume large amounts of memory and it eventually gets an OOME.
There are a few workarounds for this bug:
a) Access and/or properly close the LOBs (i.e. Blob.free).
This is partly dependent on
DERBY-2892.
b) Invoke Connection.commit (or rollback) periodically, which causes all locators on the connection to be released.