db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Gary Shank (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (DERBY-6341) LOB streaming not working with ClientDriver - IOException: object already closed
Date Tue, 10 Sep 2013 12:16:51 GMT

    [ 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

Mime
View raw message