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