You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-dev@db.apache.org by "Dag H. Wanvik (JIRA)" <ji...@apache.org> on 2013/09/23 21:45:03 UTC

[jira] [Comment Edited] (DERBY-6341) LOB streaming not working with ClientDriver - IOException: object already closed

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

Dag H. Wanvik edited comment on DERBY-6341 at 9/23/13 7:44 PM:
---------------------------------------------------------------

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 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.


                
      was (Author: dagw):
    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: 10.10.1.1
>            Reporter: Gary Shank
>
> I have a small test program using OpenJPA v2.2.2 with Derby database 10.10.1.1 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