Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Invalid
-
10.1.2.1
-
None
-
None
-
Windows XP
-
Release Note Needed
Description
An exception occurs when extracting a Blob from a database.
The following code, will ALWAYS fail with the Exception:
java.io.IOException: ERROR 40XD0: Container has been closed
at org.apache.derby.impl.store.raw.data.OverflowInputStream.fillByteHolder(Unknown Source)
at org.apache.derby.impl.store.raw.data.BufferedByteHolderInputStream.read(Unknown Source)
at java.io.DataInputStream.read(Unknown Source)
at java.io.FilterInputStream.read(Unknown Source)
at java.io.ObjectInputStream$PeekInputStream.read(Unknown Source)
at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)
at java.io.ObjectInputStream$BlockDataInputStream.readDoubles(Unknown Source)
at java.io.ObjectInputStream.readArray(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at BlobTest.readRows(BlobTest.java:81)
at BlobTest.main(BlobTest.java:23)
CODE:
import java.io.*;
import java.sql.*;
import java.util.*;
public class BlobTest
{
private static final String TABLE1 = "CREATE TABLE TABLE_1 ( "
+ "ID INTEGER NOT NULL, "
+ "COL_2 INTEGER NOT NULL, "
+ "PRIMARY KEY (ID) )";
private static final String TABLE2 = "CREATE TABLE TABLE_2 ( "
+ "ID INTEGER NOT NULL, "
+ "COL_BLOB BLOB, "
+ "PRIMARY KEY (ID) )";
public static void main(String... args) {
try
catch(Exception exp)
{ exp.printStackTrace(); }}
private static void addRows(Connection con, int size, int id)
throws Exception
private static void readRows(Connection con, int id) throws Exception
{
String sql = "SELECT * FROM TABLE_2";
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sql);
if (rs.next())
{ rs.getInt(1); readTable1(con, id); InputStream stream = rs.getBinaryStream(2); ObjectInputStream objStream = new ObjectInputStream(stream); Object obj = objStream.readObject(); // FAILS HERE double[] array = (double[]) obj; System.out.println(array.length); } rs.close();
stmt.close();
}
private static void readTable1(Connection con, int id) throws Exception {
String sql = "SELECT ID FROM TABLE_1 WHERE ID=" + id;
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sql);
if (rs.next()) {
}
rs.close();
stmt.close();
}
private static Connection getConnection() throws Exception
{ String driver="org.apache.derby.jdbc.EmbeddedDriver"; Properties p = System.getProperties(); p.put("derby.system.home", "C:\\databases\\sample"); Class.forName(driver); String url = "jdbc:derby:derbyBlob"; Connection con = DriverManager.getConnection(url); return con; }private static void createDBandTables() throws Exception
{ String driver="org.apache.derby.jdbc.EmbeddedDriver"; Properties p = System.getProperties(); p.put("derby.system.home", "C:\\databases\\sample"); Class.forName(driver); String url = "jdbc:derby:derbyBlob;create=true"; Connection con = DriverManager.getConnection(url); Statement stmt = con.createStatement(); stmt.execute(TABLE1); stmt.execute(TABLE2); stmt.close(); con.close(); }}
The Exception DOES NOT occur if call to readTable1() is not made.
The Exception DOES NOT occur if the size of the Blob is reduced - for example calling:
addRows(con, 1000, 1);
This is a show stopper.
Output from: java org.apache.derby.tools.sysinfo
------------------ Java Information ------------------
Java Version: 1.5.0_05
Java Vendor: Sun Microsystems Inc.
Java home: C:\Program Files\Java\jre1.5.0_05
Java classpath: C:\tools\derby\db-derby-10.1.2.1-bin\lib\derby.jar;C:\tools\der
by\db-derby-10.1.2.1-bin\lib\derbytools.jar;
OS name: Windows XP
OS architecture: x86
OS version: 5.1
Java user name: David
Java user home: C:\Documents and Settings\David
Java user dir: C:\david\novice\derby
java.specification.name: Java Platform API Specification
java.specification.version: 1.5
--------- Derby Information --------
JRE - JDBC: J2SE 5.0 - JDBC 3.0
[C:\tools\derby\db-derby-10.1.2.1-bin\lib\derby.jar] 10.1.2.1 - (330608)
[C:\tools\derby\db-derby-10.1.2.1-bin\lib\derbytools.jar] 10.1.2.1 - (330608)
------------------------------------------------------
----------------- Locale Information -----------------
------------------------------------------------------