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 "Gary Shank (JIRA)" <ji...@apache.org> on 2013/09/09 13:25:51 UTC

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

Gary Shank created DERBY-6341:
---------------------------------

             Summary: 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