db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Dag H. Wanvik (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (DERBY-6341) LOB streaming not working with ClientDriver - IOException: object already closed
Date Mon, 23 Sep 2013 19:45:03 GMT

    [ https://issues.apache.org/jira/browse/DERBY-6341?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13775596#comment-13775596

Dag H. Wanvik commented on DERBY-6341:

I was able to reproduce this using OpenJPA 2.2.2 the sample app examples/simple/hellojpa by
tweaking it to contain a LOB and using and Oracle Java 1.6 (I had issues running OpenJPA using
Oracle Java 1.7 and 1.8, cf. http://openjpa.208410.n2.nabble.com/JDK-1-7-seems-to-be-causing-an-issue-with-latest-snapshot-td7581417.html).

It seems OpenJPA performs a query corresponding to the JPA statement

   Message m = em2.find(Message.class, "1");

corresponding to the TRACE on the console:
   [java] 1861  hellojpa  TRACE  [main] openjpa.jdbc.SQL - <t 1377751019, conn 1692694379>
executing prepstmnt 1848398916 SELECT t0.created, t0.data, t0.message FROM Message t0 WHERE
t0.id = ? [params=?]

but having retrieved the correct record (using the id "1") using the above query, the result
set is closed (or possibly auto-closed by Derby; I will investigate). So, when the app tries
to retrieve the "data" member (an InputStream) using the returned object handle (m above),
the InputStream is closed since the LOB from which is was retrieved has been closed. 

I would say this is a JPA issue in its Derby dialect mapping. It is not a Derby error.

> LOB streaming not working with ClientDriver - IOException: object already closed
> --------------------------------------------------------------------------------
>                 Key: DERBY-6341
>                 URL: https://issues.apache.org/jira/browse/DERBY-6341
>             Project: Derby
>          Issue Type: Bug
>          Components: JDBC
>    Affects Versions:
>            Reporter: Gary Shank
> I have a small test program using OpenJPA v2.2.2 with Derby database and the
Derby org.apache.derby.jdbc.ClientDriver.  I also tried ClientDriver40.
> My entity is defined like this:
> @Entity(name = "BLOB_TEST")
> public class BlobTest implements java.io.Serializable {
>    public BlobTest() {}
>    @Id @Column(name = "PRIM_KEY", columnDefinition="VARCHAR(10)")
>    private String primKey = null;
>    public void setKey(String key) { primKey = key; }
>    public String getKey() { return primKey; }
>    @Persistent @Column(name = "DATA")
>    private InputStream data = null;
>    public void setData(InputStream data) { this.data = data; }
>    public InputStream getData() { return data; }
> }
> Putting data into the database works fine:
> EntityManager em = open(); // performs configuration and emf.createEntityManager();
> em.getTransaction().begin();
> FileInputStream fis = new FileInputStream("someInputFile");
> BlobTest bt = new BlobTest();
> bt.setKey("1");
> bt.setData(fis);
> em.persist(bt);
> em.getTransaction().commit();
> em.close();
> Getting the data fails with "IOException: The object is already closed." when any InputStream.read
method is called:
> EntityManager em = open(); // performs configuration and emf.createEntityManager();
> BlobTest bt = em.find(BlobTest.class, "1"); // the record is found
> InputStream is = bt.getData();
> while ( (bytesRead = is.read(buffer, 0, len)) != -1 )
> java.io.IOException: The object is already closed.
> at org.apache.derby.client.am.CloseFilterInputStream.read(Unknown Source)
> Getting the data works if I use JDBC directly like this:
> EntityManager em = open(); // performs configuration and emf.createEntityManager();
> Connection conx = (Connection)org.apache.openjpa.persistence.OpenJPAPersistence.cast(em).getConnection();
> PreparedStatement pstmt = conx.prepareStatement("select DATA from BLOB_TEST where PRIM_KEY='1'");
> ResultSet rs = pstmt.executeQuery();
> InputStream is = rs.getBinaryStream(1);
> while ( (bytesRead = is.read(buffer, 0, len)) != -1 )
> Is this a bug or am I just doing something wrong?  My code has to work with multiple
databases so I can't really use JDBC directly - which is I opted for using OpenJPA.  I'm not
sure if this is an OpenJPA issue or Derby issue but, at the moment, I'm assuming is a problem
with the client driver.  By the way, I did not test with the embedded driver since we need
it to work with the client driver.  I've looked at the following other issues:
> DERBY-3646 mentions "object already close" and the CloseFilterInputStream
> OPENJPA-1248 - LOB streaming does not work as expected
> OPENJPA-130 - use of InputStream for LOB streaming

This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

View raw message