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