[ http://issues.apache.org/jira/browse/DERBY-1559?page=all ]

Andreas Korneliussen updated DERBY-1559:
----------------------------------------

    Attachment: DERBY-1559v6.diff

Found a bug while testing the patch DERBY-1559v5.diff:

In case of an DRDAProtoclException while doing the streaming of the data, the 
DDMReader.readLOBContinuationStream(.) method called agent.handleException(..). 
 This will cause the connection to be rolled back from within the stream 
(within an execute statement), and the engine throws an exception:

Execution failed because of Permanent Agent Error: SVRCOD = 40; RDBNAM = 
/export/home/tmp/db/bigdb2;create=true; diagnostic msg  = Cannot issue rollback 
in a nested connection when there is a pending operation in the parent 
connection.
org.apache.derby.impl.drda.DRDAProtocolException: Execution failed because of 
Permanent Agent Error: SVRCOD = 40; RDBNAM = /exp 
ort/home/tmp/db/bigdb2;create=true; diagnostic msg = Cannot issue rollback in a 
nested connection when there is a pending opera tion in the parent connection.

The side-effect of this error is quite severe, since it seems that the 
connection will never be rolled back.

The attached patch DERBY-1559v6.diff addresses this by having 
DDMReader.readLOBContinuationStream(.)  only log the exception.  The connection 
will be rolled back later by DRDAConnectionThread when the exception comes out 
from statement.execute().


> when receiving a single EXTDTA object representing a BLOB, the server do not 
> need to read it into memory before inserting it into the DB
> ----------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-1559
>                 URL: http://issues.apache.org/jira/browse/DERBY-1559
>             Project: Derby
>          Issue Type: Sub-task
>          Components: Network Server
>    Affects Versions: 10.2.1.0, 10.3.0.0, 10.2.2.0
>            Reporter: Andreas Korneliussen
>         Assigned To: Andreas Korneliussen
>         Attachments: DERBY-1559.diff, DERBY-1559.stat, DERBY-1559v2.diff, 
> DERBY-1559v3.diff, DERBY-1559v4.diff, DERBY-1559v5.diff, DERBY-1559v6.diff, 
> serverMemoryUsage.xls
>
>
> When streaming a BLOB from the Network Client to the Network Server, the 
> Network server currently read all the data from the stream and put it into a 
> byte array.
> The blob data is then inserted into the DB by using
> PreparedStatement.setBytes(..)
> and later
> PreparedStatement.execute()
> To avoid OutOfMemoryError if the size of the Blob is > than total memory in 
> the VM, we could make the network server create a stream which reads data 
> when doing PreparedStatement.execute().  The DB will then stream the BLOB 
> data directly from the network inputstream into the disk.
> I intent to make a patch which does this if there is only one EXTDTA object 
> (BLOB) sent from the client in the statement, as it will simplify the 
> implementation. Later this can be improved  further to include CLOBs, and 
> possibly to include the cases where there are multiple EXTDTA objects.
> --
> CLOBs are more complex, as there need to be some character encoding. This can 
> be achieved by using a InputStreamReader,  and use 
> PreparedStatement.setCharacterStream(..). However the size of the stream is 
> not necessarily the same as the size of the raw binary data, and to do this 
> for CLOBs, I would need the embedded prepared statements to support the new 
> setCharacterStream() overloads in JDBC4 (which do not include a length 
> atribute)
> --
> Multiple EXTDATA objects are also more complex, since one would need to have 
> fully read the previous object ,before it is possible to read the next.
> --

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to