(jdbc net client) exception during normal iteration through "ResultSet" of
"select * from t"
--------------------------------------------------------------------------------------------
Key: DERBY-3243
URL: https://issues.apache.org/jira/browse/DERBY-3243
Project: Derby
Issue Type: Bug
Components: JDBC
Affects Versions: 10.3.1.5
Environment: ------------------ 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 -----------------
------------------------------------------------------
Reporter: Oliver Seidel
Priority: Critical
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 { java.lang.Thread.sleep(5000); } catch (Exception
e) { };
log("started DERBY on host "+host+" port
"+Integer.toString(port)+".");
} catch (Exception e) {
log_stacktrace(e);
};
};
//
------------------------------------------------------------------------
public static java.sql.Connection con()
throws java.sql.SQLException, java.lang.ClassNotFoundException {
Class.forName("org.apache.derby.jdbc.ClientDriver");
String x_dbse = "test_db";
String x_user = ";user=os10000";
String x_pass = ";password=ding";
String x_crte = ";create=true";
String x_msgs = ";retrieveMessagesFromServerOnGetMessage=true";
String connect =
"jdbc:derby://"+host+":"+port+"/"+x_dbse+x_user+x_crte+x_msgs;
return java.sql.DriverManager.getConnection(connect);
};
//
----------------------------------------------------------------------
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) { caw.write(cb,off,bts); off+=bts;
bts=rd.read(cb); };
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) { v=z; };
public java.io.InputStream getAsciiStream() { return new
java.io.ByteArrayInputStream(v.getBytes()); };
public java.io.Reader getCharacterStream() { return new
java.io.CharArrayReader(v.toCharArray()); };
public String getSubString(long pos, int length) { return
v.substring((int)pos,(int)(pos+length)); };
public long length() { return v.length(); };
public long position(java.sql.Clob pattern, long start) {
return 0; };
public long position(String pattern, long start) { return 0; };
public java.io.OutputStream setAsciiStream(long pos) {
new java.sql.SQLException("setAsciiStream not
implemented."); return null; };
public java.io.Writer setCharacterStream(long pos) {
new java.sql.SQLException("setCharacterStream not
implemented."); return null; };
public int setString(long pos, String s) {
new java.sql.SQLException("setString not
implemented."); return -1; };
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) {
new java.sql.SQLException("truncate not implemented.");
};
};
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 { return getclob(rs.getClob(arg));
};
public static void setLob(java.sql.PreparedStatement ps, int arg,
String val)
throws java.sql.SQLException { ps.setClob(arg,putclob(val)); };
//
------------------------------------------------------------------------
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) {
double db = 256*Math.random();
buf[--len] = (byte)db;
};
return clean_string(new String(buf));
};
//
------------------------------------------------------------------------
public static void update(java.sql.Connection c, String cmd)
throws java.sql.SQLException {
c.createStatement().execute(cmd);
};
//
------------------------------------------------------------------------
public static final int entries=100000;
public static void fill_db(java.sql.Connection c)
throws java.sql.SQLException {
try { update(c,"drop table mail_raw"); } catch (Exception e) {};
try { update(c,"create table mail_raw ( msg varchar(999), att
varchar(100), val clob )"); }
catch (Exception e) { log_stacktrace(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()) {
String msg = rs.getString(1);
String att = rs.getString(2);
String val = getLob(rs,3);
};
};
//
------------------------------------------------------------------------
public static void main(String args[]) {
start_server();
try {
java.sql.Connection c = con();
fill_db(c);
dump_db(c);
} catch (Exception e) { log_stacktrace(e); };
};
//
------------------------------------------------------------------------
};
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.