Details
Description
When a store stream Clob is going to be modified, it will be written out to the temporary area of Derby and represented as a TemporaryClob.
The transfer of the data is done in a sub-optimal manner for two reasons;
o for transfer of the complete Clob, the copy method operates on the byte level and we're not able to save the character length.
o for transfer of parts of the Clob (i.e. truncation), we have to first decode the UTF-8 encoding to find the byte count and then transfer the same bytes.
I intend to do the following two changes;
1) Add a getCharLengthIfKnow-method to InternalClob.
2) Add a UTF-8 aware copy method to LOBStreamControl.
When a complete Clob is to be copied, code like this will be executed;
cachedCharLength = internalClob.getLengthIfKnown();
if (cachedCharLength > 0)
// use existing byte-oriented copy method for best performance (copy until EOF)
else
cachedCharLength = control.copyUTF8Data()
When parts of a Clob is to be copied, we always use the UTF-8 aware copy method, but we also do a cheap range check.
cachedCharLength = internalClob.getLengthIfKnown();
if (cachedCharLength > 0 && requestedLength > cachedCharLength)
throw EOFException();
if (cachedCharLength == requestedLength)
// use existing byte-oriented copy method for best performance (copy until EOF)
else
cachedCharLength = control.copyUTF8Data(requestedLength);
Adding the UTF-8 aware copy method was started under DERBY-4023, including comments on the first revision of a patch.
Attachments
Attachments
Issue Links
- is related to
-
DERBY-4023 Improve length caching in TemporaryClob
- Closed