You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-dev@db.apache.org by "Knut Anders Hatlen (JIRA)" <ji...@apache.org> on 2008/02/01 00:07:10 UTC

[jira] Commented: (DERBY-3243) (jdbc net client) exception during normal iteration through "ResultSet" of "select * from t"

    [ https://issues.apache.org/jira/browse/DERBY-3243?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12564539#action_12564539 ] 

Knut Anders Hatlen commented on DERBY-3243:
-------------------------------------------

For completeness, you may also want to skip all negative values and zero (the client only accepts positive locators). This only happens if you wrap around at ~2 billion, but with long-lived connections (for instance in a connection pool) it's possible. We're only talking about 68 lobs a second continuously for one year... ;)

> (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.2.1
>         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
>         Attachments: derby-3243_diff.txt, derby-3243_fix_double_hashmap_entry_diff.txt, derby-3243_fix_double_hashmap_entry_diff2.txt, derby-3243_fix_double_hashmap_entry_stat.txt, derby-3243_stat.txt
>
>
> 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.