Subject | fb server crash in multi thread,connection table creation |
---|---|
Author | kartinku |
Post date | 2004-11-20T06:50:44Z |
Dear Members ,
I am doing some scalability testing of firebird DB. During my test
firebird database server has got killed. I have spawn multiple threads
an in each I have created tables with a connection in each thread. Is
there is any thereshold limit for firebird server in terms of
memory,connection etc. If so kindly detail me or provide any
linkdetailing the same,
I spawn 20 threads simultaneously. In each thread I got FB (Super
server , 1.5.1 release version) db server connection through driver
manager. In each thread I kept creating table (30 in each thread)
in autocommit false. I have set JVM memory has 20MB. But I got
exception like below.
Exception :
org.firebirdsql.gds.GDSException: Error reading data from the connection.
ull
at
org.firebirdsql.jgds.GDS_Impl.receiveResponse(GDS_Impl.java:1784)
at
org.firebirdsql.jgds.GDS_Impl.isc_commit_transaction(GDS_Impl.java:593)
at
org.firebirdsql.jca.FBManagedConnectionFactory.commit(FBManagedConnectionFactory.ja
at
org.firebirdsql.jca.FBManagedConnection.internalCommit(FBManagedConnection.java:411
at
org.firebirdsql.jca.FBLocalTransaction.internalCommit(FBLocalTransaction.java:155)
at
org.firebirdsql.jdbc.AbstractConnection.commit(AbstractConnection.java:372)
at org.firebirdsql.jdbc.FBConnection.commit(FBConnection.java:52)
at
TestMultiConnection$ChildCreate.run(TestMultiConnection.java:114)
at java.lang.Thread.run(Thread.java:536)
firebird server has got killed.
When I run the same program in embedded server I have got below
exception and program has got hanged. When I have taken a thread dump
, all threads has got hanged in commit. method
Exception :
org.firebirdsql.ngds.InternalError: Unexpected exception caught.
at
org.firebirdsql.ngds.GDS_Impl.native_isc_commit_transaction(Native Method)
at
org.firebirdsql.ngds.GDS_Impl.isc_commit_transaction(GDS_Impl.java:455)
at
org.firebirdsql.jca.FBManagedConnectionFactory.commit(FBManagedConnectionFactory.java:708)
at
org.firebirdsql.jca.FBManagedConnection.internalCommit(FBManagedConnection.java:411)
at
org.firebirdsql.jca.FBLocalTransaction.internalCommit(FBLocalTransaction.java:155)
at
org.firebirdsql.jdbc.AbstractConnection.commit(AbstractConnection.java:372)
at org.firebirdsql.jdbc.FBConnection.commit(FBConnection.java:52)
at
TestMultiConnection$ChildCreate.run(TestMultiConnection.java:115)
at java.lang.Thread.run(Thread.java:536)
I am not sure whether is this an issue or expected behaviour. If I
am wrong kindly clarify me. And I feel issue will be firebird DB. So
I have forwarded the issue to both java and support forums. I have
uploded my test program in firebird -java --> File. File name is
TestMultiConnection.java. I have pasted the same testprogram at the
end of this mail. If there is any flaw in my program kindly let me
know about it.
Environment :
O.S : Windows 2000 professional
FB : firebird 1.5.1.4481
Jaybird : 1.5.4
JDK : 1.4.1_03
import java.sql.*;
import java.util.*;
import java.util.logging.*;
public class TestMultiConnection
{
int counter=0;
boolean autoCommit = false;
int number=20; // indicates numeber od threads/connection
int step = 30; // no of table to be created in each thread
int total=600; // total no of tables i.e number * step
public TestMultiConnection(String[] args) throws Exception
{
autoCommit = (new Boolean(args[0])).booleanValue();
//number = Integer.parseInt(args[1]);
//step = Integer.parseInt(args[2]);
doTheBusiness();
}
Connection conn = null;
public Connection getConnection()
throws Exception
{
String driverName = "org.firebirdsql.jdbc.FBDriver";
String jdbcUrl =
"jdbc:firebirdsql:localhost/3050:c:/webserver/htdocs/thirdparty/firebird/actual_FB/installed/examples/TEST2.FDB";
// jdbcUrl =
"jdbc:firebirdsql:embedded:c:/webserver/htdocs/thirdparty/firebird/actual_FB/installed/examples/TEST2.FDB";
//String jdbcUrl =
"jdbc:firebirdsql:localhost/3050:c:/webserver/htdocs/thirdparty/firebird/ourEmbed/loadtest/windows/db/MICKEY2.FDB";
Class.forName (driverName);
java.sql.Driver d = java.sql.DriverManager.getDriver (jdbcUrl);
Connection conn = java.sql.DriverManager.getConnection
(jdbcUrl, "sysdba" , "masterkey");
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
conn.setAutoCommit(autoCommit);
return conn;
}
private void doTheBusiness()
throws Exception
{
//create 5 threads
Thread[] ths = new Thread[number];
counter=0;
//start the threads
for(int i=0; i<number; i++)
{
int temp=counter+step;
ChildCreate child = new ChildCreate();
//set range oif tables to be create , 1..20 , 21 ..40 etc
child.setRange(counter,temp);
ths[i] = new Thread(child,"C-"+i+":");
ths[i].start();
counter =temp;
}
//wait till all threads gets completed
for(int i=0; i<number; i++)
{
ths[i].join();
}
}
class ChildCreate implements Runnable
{
ChildCreate()
{
}
int start=-1, end=-1;
void setRange(int start , int end)
{
this.start = start;
this.end = end;
}
public void run()
{
try
{
Random rd = new Random();
Connection c = null;
try
{
c = getConnection();
for (int i=start; i<end; i++)
{
String sql = "create table BB"+i +"(ID INTEGER
NOT NULL PRIMARY KEY)";
Statement statement= c.createStatement();
statement.executeUpdate(sql);
statement.close();
}
if(!c.getAutoCommit())
{
c.commit();
}
}
catch(Exception e)
{
if(!c.getAutoCommit())
{
c.rollback();
}
e.printStackTrace();
}
finally
{
c.close();
}
}
catch(Exception e)
{
System.err.println("ERROR : FIX : ");
e.printStackTrace();
}
}
}
public static void main(String[] args)
throws Exception
{
new TestMultiConnection(args);
}
}// TestMultiConnection
I am doing some scalability testing of firebird DB. During my test
firebird database server has got killed. I have spawn multiple threads
an in each I have created tables with a connection in each thread. Is
there is any thereshold limit for firebird server in terms of
memory,connection etc. If so kindly detail me or provide any
linkdetailing the same,
I spawn 20 threads simultaneously. In each thread I got FB (Super
server , 1.5.1 release version) db server connection through driver
manager. In each thread I kept creating table (30 in each thread)
in autocommit false. I have set JVM memory has 20MB. But I got
exception like below.
Exception :
org.firebirdsql.gds.GDSException: Error reading data from the connection.
ull
at
org.firebirdsql.jgds.GDS_Impl.receiveResponse(GDS_Impl.java:1784)
at
org.firebirdsql.jgds.GDS_Impl.isc_commit_transaction(GDS_Impl.java:593)
at
org.firebirdsql.jca.FBManagedConnectionFactory.commit(FBManagedConnectionFactory.ja
at
org.firebirdsql.jca.FBManagedConnection.internalCommit(FBManagedConnection.java:411
at
org.firebirdsql.jca.FBLocalTransaction.internalCommit(FBLocalTransaction.java:155)
at
org.firebirdsql.jdbc.AbstractConnection.commit(AbstractConnection.java:372)
at org.firebirdsql.jdbc.FBConnection.commit(FBConnection.java:52)
at
TestMultiConnection$ChildCreate.run(TestMultiConnection.java:114)
at java.lang.Thread.run(Thread.java:536)
firebird server has got killed.
When I run the same program in embedded server I have got below
exception and program has got hanged. When I have taken a thread dump
, all threads has got hanged in commit. method
Exception :
org.firebirdsql.ngds.InternalError: Unexpected exception caught.
at
org.firebirdsql.ngds.GDS_Impl.native_isc_commit_transaction(Native Method)
at
org.firebirdsql.ngds.GDS_Impl.isc_commit_transaction(GDS_Impl.java:455)
at
org.firebirdsql.jca.FBManagedConnectionFactory.commit(FBManagedConnectionFactory.java:708)
at
org.firebirdsql.jca.FBManagedConnection.internalCommit(FBManagedConnection.java:411)
at
org.firebirdsql.jca.FBLocalTransaction.internalCommit(FBLocalTransaction.java:155)
at
org.firebirdsql.jdbc.AbstractConnection.commit(AbstractConnection.java:372)
at org.firebirdsql.jdbc.FBConnection.commit(FBConnection.java:52)
at
TestMultiConnection$ChildCreate.run(TestMultiConnection.java:115)
at java.lang.Thread.run(Thread.java:536)
I am not sure whether is this an issue or expected behaviour. If I
am wrong kindly clarify me. And I feel issue will be firebird DB. So
I have forwarded the issue to both java and support forums. I have
uploded my test program in firebird -java --> File. File name is
TestMultiConnection.java. I have pasted the same testprogram at the
end of this mail. If there is any flaw in my program kindly let me
know about it.
Environment :
O.S : Windows 2000 professional
FB : firebird 1.5.1.4481
Jaybird : 1.5.4
JDK : 1.4.1_03
import java.sql.*;
import java.util.*;
import java.util.logging.*;
public class TestMultiConnection
{
int counter=0;
boolean autoCommit = false;
int number=20; // indicates numeber od threads/connection
int step = 30; // no of table to be created in each thread
int total=600; // total no of tables i.e number * step
public TestMultiConnection(String[] args) throws Exception
{
autoCommit = (new Boolean(args[0])).booleanValue();
//number = Integer.parseInt(args[1]);
//step = Integer.parseInt(args[2]);
doTheBusiness();
}
Connection conn = null;
public Connection getConnection()
throws Exception
{
String driverName = "org.firebirdsql.jdbc.FBDriver";
String jdbcUrl =
"jdbc:firebirdsql:localhost/3050:c:/webserver/htdocs/thirdparty/firebird/actual_FB/installed/examples/TEST2.FDB";
// jdbcUrl =
"jdbc:firebirdsql:embedded:c:/webserver/htdocs/thirdparty/firebird/actual_FB/installed/examples/TEST2.FDB";
//String jdbcUrl =
"jdbc:firebirdsql:localhost/3050:c:/webserver/htdocs/thirdparty/firebird/ourEmbed/loadtest/windows/db/MICKEY2.FDB";
Class.forName (driverName);
java.sql.Driver d = java.sql.DriverManager.getDriver (jdbcUrl);
Connection conn = java.sql.DriverManager.getConnection
(jdbcUrl, "sysdba" , "masterkey");
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
conn.setAutoCommit(autoCommit);
return conn;
}
private void doTheBusiness()
throws Exception
{
//create 5 threads
Thread[] ths = new Thread[number];
counter=0;
//start the threads
for(int i=0; i<number; i++)
{
int temp=counter+step;
ChildCreate child = new ChildCreate();
//set range oif tables to be create , 1..20 , 21 ..40 etc
child.setRange(counter,temp);
ths[i] = new Thread(child,"C-"+i+":");
ths[i].start();
counter =temp;
}
//wait till all threads gets completed
for(int i=0; i<number; i++)
{
ths[i].join();
}
}
class ChildCreate implements Runnable
{
ChildCreate()
{
}
int start=-1, end=-1;
void setRange(int start , int end)
{
this.start = start;
this.end = end;
}
public void run()
{
try
{
Random rd = new Random();
Connection c = null;
try
{
c = getConnection();
for (int i=start; i<end; i++)
{
String sql = "create table BB"+i +"(ID INTEGER
NOT NULL PRIMARY KEY)";
Statement statement= c.createStatement();
statement.executeUpdate(sql);
statement.close();
}
if(!c.getAutoCommit())
{
c.commit();
}
}
catch(Exception e)
{
if(!c.getAutoCommit())
{
c.rollback();
}
e.printStackTrace();
}
finally
{
c.close();
}
}
catch(Exception e)
{
System.err.println("ERROR : FIX : ");
e.printStackTrace();
}
}
}
public static void main(String[] args)
throws Exception
{
new TestMultiConnection(args);
}
}// TestMultiConnection