[ https://issues.apache.org/jira/browse/DERBY-6341?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13762995#comment-13762995 ]
Gary Shank commented on DERBY-6341: ----------------------------------- I added some debugging messages to the org.apache.derby.client.am.CloseFilterInputStream class and found that the InputStream is being closed due to the DelegatingResultSet.close call from OpenJPA after doing EntityManager.find: at org.apache.derby.client.am.CloseFilterInputStream.close(CloseFilterInputStream.java:85) at org.apache.derby.client.am.ResultSet.closeOpenStreams(ResultSet.java:5493) at org.apache.derby.client.am.ResultSet.closeX(ResultSet.java:441) at org.apache.derby.client.am.ResultSet.close(ResultSet.java:425) at org.apache.commons.dbcp.DelegatingResultSet.close(DelegatingResultSet.java:187) at org.apache.commons.dbcp.DelegatingResultSet.close(DelegatingResultSet.java:187) at org.apache.openjpa.lib.jdbc.DelegatingResultSet.close(DelegatingResultSet.java:113) at org.apache.openjpa.jdbc.sql.ResultSetResult.close(ResultSetResult.java:184) at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.initializeState(JDBCStoreManager.java:418) at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.initialize(JDBCStoreManager.java:306) at org.apache.openjpa.kernel.DelegatingStoreManager.initialize(DelegatingStoreManager.java:112) at org.apache.openjpa.kernel.ROPStoreManager.initialize(ROPStoreManager.java:57) at org.apache.openjpa.kernel.BrokerImpl.initialize(BrokerImpl.java:1046) at org.apache.openjpa.kernel.BrokerImpl.find(BrokerImpl.java:1004) at org.apache.openjpa.kernel.BrokerImpl.find(BrokerImpl.java:921) at org.apache.openjpa.kernel.DelegatingBroker.find(DelegatingBroker.java:231) at org.apache.openjpa.persistence.EntityManagerImpl.find(EntityManagerImpl.java:487) > 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