In the following sample program we are experiencing a weird problem, when I execute selects reading date fields at the same time (threads) over a table in a computer with 2 or more processors we receive, some times the correct answer, some times a error (bellow) or some times o wrong number of records in the resultset.
package tests;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
public class TestWithConcurrency {
public static void main(String args[]) throws Exception {
Class.forName("com.hxtt.sql.dbf.DBFDriver");
String sql = "SELECT CASE WHEN datez IS NULL THEN NULL "+
"WHEN MONTH(datez)>11 THEN CDATE('01/12/'+STR(YEAR(datez)),'dd/MM/yyyy') "+
"ELSE CDATE('01/01/'+STR(YEAR(datez)),'dd/MM/yyyy') END AS M11C0 "+
"FROM tst "+
"ORDER BY 1 ASC";
Connection conn = DriverManager.getConnection("jdbc:dbf:/C:/TEMP/");
ConcurrentQuery cq1 = new ConcurrentQuery(conn, 50, sql);
Connection conn2 = DriverManager.getConnection("jdbc:dbf:/C:/TEMP/");
ConcurrentQuery cq2 = new ConcurrentQuery(conn2, 0, sql);
}
}
class ConcurrentQuery implements Runnable {
private Connection conn;
private long sleeping = 0;
private String sql;
public ConcurrentQuery(Connection conn, long sleeping, String sql) {
this.conn = conn;
this.sleeping = sleeping;
this.sql = sql;
Thread t = new Thread(this);
t.start();
}
public void run() {
try{
Thread.sleep(sleeping);
ResultSet rs = conn.createStatement().executeQuery(sql);
writeResult(rs);
rs.close();
}catch (Exception e){
e.printStackTrace();
} finally {
try{
conn.close();
}catch (Exception ex){
ex.printStackTrace();
}
}
}
private void writeResult(ResultSet rs) throws Exception{
int rows = 0;
while (rs.next()) {
rows = rs.getRow();
}
System.out.println("Rows in rs: " + rows );
}
}
Error
java.lang.ArrayIndexOutOfBoundsException: 13
at sun.util.calendar.BaseCalendar.getCalendarDateFromFixedDate(BaseCalendar.java:436)
at java.util.GregorianCalendar.computeFields(GregorianCalendar.java:2081)
at java.util.GregorianCalendar.computeTime(GregorianCalendar.java:2472)
at java.util.Calendar.updateTime(Calendar.java:2468)
at java.util.Calendar.getTimeInMillis(Calendar.java:1087)
at java.util.Calendar.getTime(Calendar.java:1060)
at com.hxtt.global.ah.a(Unknown Source)
at com.hxtt.global.ah.a(Unknown Source)
at com.hxtt.b.b.a(Unknown Source)
at com.hxtt.sql.dbf.i.a(Unknown Source)
at com.hxtt.sql.dbf.i.a(Unknown Source)
at com.hxtt.sql.dbf.i.a(Unknown Source)
at com.hxtt.sql.cq.a(Unknown Source)
at com.hxtt.sql.ej.a(Unknown Source)
at com.hxtt.sql.dl.a(Unknown Source)
at com.hxtt.d.k.a(Unknown Source)
at com.hxtt.d.b.a(Unknown Source)
at com.hxtt.d.k.a(Unknown Source)
at com.hxtt.d.m.a(Unknown Source)
at com.hxtt.d.k.a(Unknown Source)
at com.hxtt.d.d.aN(Unknown Source)
at com.hxtt.d.d.a(Unknown Source)
at com.hxtt.d.k.a(Unknown Source)
at com.hxtt.d.b.a(Unknown Source)
at com.hxtt.d.k.a(Unknown Source)
at com.hxtt.sql.df.a(Unknown Source)
at com.hxtt.sql.cx.new(Unknown Source)
at com.hxtt.sql.cx.next(Unknown Source)
at tests.ConcurrentQuery.writeResult(TestWithConcurrency.java:56)
at tests.ConcurrentQuery.run(TestWithConcurrency.java:42)
at java.lang.Thread.run(Thread.java:619)
|
Thanks. Please download the latest package, that CDATE function can support multithread now.
|