Details
-
Bug
-
Status: Closed
-
Critical
-
Resolution: Fixed
-
10.3.2.1
-
None
-
------------------ Java Information ------------------
Java Version: 1.4.2_03
Java Vendor: Sun Microsystems Inc.
Java home: C:\Programme\Java\j2re1.4.2_03
Java classpath: derbyclient.jar
OS name: Windows XP
OS architecture: x86
OS version: 5.1
Java user name: cbdqok
Java user home: C:\Dokumente und Einstellungen\cbdqok
Java user dir: D:\users\cbdqok\privat\osj\lib_derby_net\lib
java.specification.name: Java Platform API Specification
java.specification.version: 1.4
--------- Derby Information --------
JRE - JDBC: J2SE 1.4.2 - JDBC 3.0
[D:\users\cbdqok\privat\osj\lib_derby_net\lib\derbyclient.jar] 10.3.1.4 - (561794)
------------------------------------------------------
----------------- Locale Information -----------------
------------------------------------------------------
------------------ Java Information ------------------ Java Version: 1.4.2_03 Java Vendor: Sun Microsystems Inc. Java home: C:\Programme\Java\j2re1.4.2_03 Java classpath: derbyclient.jar OS name: Windows XP OS architecture: x86 OS version: 5.1 Java user name: cbdqok Java user home: C:\Dokumente und Einstellungen\cbdqok Java user dir: D:\users\cbdqok\privat\osj\lib_derby_net\lib java.specification.name: Java Platform API Specification java.specification.version: 1.4 --------- Derby Information -------- JRE - JDBC: J2SE 1.4.2 - JDBC 3.0 [D:\users\cbdqok\privat\osj\lib_derby_net\lib\derbyclient.jar] 10.3.1.4 - (561794) ------------------------------------------------------ ----------------- Locale Information ----------------- ------------------------------------------------------
-
Low
-
Patch Available
-
Regression
Description
Thanks again to the DERBY developers.
For my convenience I use the client/server variant of DERBY. This is where the error occurs. I have temporarily alleviated the problem for my case by using the embedded version.
I'm forced to use outlook and have built a program which siphons the messages into a derby database (phase 1 – table has two varchar fields and a clob). When reading them back (phase 2 – simple select of all records in no particular order, all 3 attributes), it has developed an exception. This is a result of data volume. I have reduced the problem to a single demonstration program.
This behaviour, and the fact that the error is not a "DERBY Exception", but a proper exception coming back from the JDBC call, leads me to the diagnosis that it is a derby network client jdbc problem.
The problem has been reproduced once by Bryan Pendleton: http://www.nabble.com/IndexOutOfBoundsException-t4926228.html
I'll try to attach the code "error.java"; it can also be found on: http://www.os10000.net/error.java
Please use as follows:
javac -classpath derby.jar:derbynet.jar error.java
java -cp .:derby.jar:derbynet.jar error
It will create a directory "test_db" and fill it with approx 120mb data.
Then you will observe the failure.
/* Mode:Java; c-basic-offset:8 */
// --------------------------------------------------------------------------------
public class error {
// ------------------------------------------------------------------------
public static final int port = 1527;
public static final String host = "127.0.0.1";
// ------------------------------------------------------------------------
public static void log(String x)
{ System.out.println(x); };
// ------------------------------------------------------------------------
public static void log_stacktrace(Exception e)
{ java.io.StringWriter sw = new java.io.StringWriter(); java.io.PrintWriter pw = new java.io.PrintWriter(sw); e.printStackTrace(pw); log(sw.toString()); };
// ------------------------------------------------------------------------
public static void start_server() {
try {
org.apache.derby.drda.NetworkServerControl server =
new org.apache.derby.drda.NetworkServerControl(java.net.InetAddress.getByName(host),port);
server.start(null);
try
catch (Exception e) { };
log("started DERBY on host "host" port "Integer.toString(port)".");
} catch (Exception e)
;
};
// ------------------------------------------------------------------------
public static java.sql.Connection con()
throws java.sql.SQLException, java.lang.ClassNotFoundException
;
// ----------------------------------------------------------------------
public static String getclob(java.sql.Clob b) {
java.io.CharArrayWriter caw = new java.io.CharArrayWriter();
try {
java.io.Reader rd = b.getCharacterStream();
char cb[] = new char[4096];
int off=0, bts = rd.read(cb);
while (bts>0)
;
rd.close();
} catch(Exception e) {};
String res = caw.toString();
caw.close();
return res;
};
// ----------------------------------------------------------------------
public static class myclob implements java.sql.Clob {
String v;
public myclob(String z)
;
public java.io.InputStream getAsciiStream()
;
public java.io.Reader getCharacterStream()
;
public String getSubString(long pos, int length)
;
public long length()
;
public long position(java.sql.Clob pattern, long start)
public long position(String pattern, long start) { return 0; }
;
public java.io.OutputStream setAsciiStream(long pos)
;
public java.io.Writer setCharacterStream(long pos)
;
public int setString(long pos, String s)
public int setString(long pos, String s, int offset, int len) { new java.sql.SQLException("setString not implemented."); return -1; }
;
public void truncate(long len)
;
};
public static java.sql.Clob putclob(String x)
{ return new myclob(x); };
// ------------------------------------------------------------------------
public static String getLob(java.sql.ResultSet rs, int arg)
throws java.sql.SQLException
;
public static void setLob(java.sql.PreparedStatement ps, int arg, String val)
throws java.sql.SQLException
;
// ------------------------------------------------------------------------
public static String clean_string(String x)
{ return x.replaceAll("[\0\r\\\\]","").replaceAll("'","\\\"").replaceAll(",+",","); };
// ------------------------------------------------------------------------
public static String make_string(int digits) {
double dl = (Math.random()) * (Math.pow(10.0,digits*Math.random()));
int len = (int) dl;
byte buf[] = new byte[len];
while (len>0)
;
return clean_string(new String(buf));
};
// ------------------------------------------------------------------------
public static void update(java.sql.Connection c, String cmd)
throws java.sql.SQLException
;
// ------------------------------------------------------------------------
public static final int entries=100000;
public static void fill_db(java.sql.Connection c)
throws java.sql.SQLException {
try
catch (Exception e) {};
try
{ update(c,"create table mail_raw ( msg varchar(999), att varchar(100), val clob )"); }
catch (Exception e)
java.sql.PreparedStatement pstmt = null;
try { pstmt = c.prepareStatement("insert into mail_raw values ( ?, ?, ? )"); }
catch (Exception e) { log_stacktrace(e); }
;
for (int i=0; i<entries; i++)
{ pstmt.setString(1,make_string(3)); pstmt.setString(2,"5 body"); setLob(pstmt,3,make_string(4)); pstmt.executeUpdate(); if (i%100==0) log("step "+i+"/"+entries); };
};
// ------------------------------------------------------------------------
public static void dump_db(java.sql.Connection c)
throws java.sql.SQLException {
log("performing dump.");
java.sql.ResultSet rs = c.createStatement().executeQuery("select * from mail_raw");
while (rs.next())
;
};
// ------------------------------------------------------------------------
public static void main(String args[]) {
start_server();
try
catch (Exception e)
{ log_stacktrace(e); };
};
// ------------------------------------------------------------------------
};
Attachments
Attachments
Issue Links
- is related to
-
DERBY-2702 Enable Clob locator support between NetworkServer and NetworkClient and modify tests that experience changed behaviour due to this(enabling Clob Locators).
- Closed
- relates to
-
DERBY-3365 Network Server stores a duplicate entry in the lob hash map for every lob
- Closed
-
DERBY-3377 Network Client/Server should use sqlType instead of locator value to determine if lob was sent by locator/value
- Open