Re: odd jdbc driver synchronization issue - Mailing list pgsql-jdbc
From | George Lessmann |
---|---|
Subject | Re: odd jdbc driver synchronization issue |
Date | |
Msg-id | 006c01c3cfe5$24f4cfb0$85342fa5@elvis Whole thread Raw |
In response to | Re: odd jdbc driver synchronization issue (Dave Cramer <pg@fastcrypt.com>) |
Responses |
Re: odd jdbc driver synchronization issue
|
List | pgsql-jdbc |
Dave, all, Sorry, I thought this was such an obvious thing to do; it would be some setting or something I missed (does the jdbc driver have any debug options?). Some of the code is proprietary. Hopefully, this will give you an idea of what is happening. Basically, create a number of clients, load them with parents, and then run() them. While running, a client inserts one parent and a number of children. package jdbhammer; /** * @author George Lessmann * copyright 2003, George Lessmann * code may not be reused without permission */ import java.util.ArrayList; import org.apache.commons.dbcp.DriverManagerConnectionFactory; import org.apache.commons.dbcp.PoolableConnectionFactory; import org.apache.commons.dbcp.PoolingDriver; import org.apache.commons.pool.impl.GenericObjectPool; public final class Main { private static String resultsLocation = null; private static String username = "postgres"; private static String password = ""; public static void main(String[] args) { if (args == null | "?".equals(args[0])) { System.out.println("Usage: java -jar jDBHammer.jar [#clients] [#dbconnections] [#parents] [#children per parent] [server] [username] [password]"); return; }// if if (args.length >= 5) { server = args[4]; }// if if (args.length >= 6) { username = args[5]; }// if if (args.length >= 7) { password = args[6]; }// if resultsLocation = "c:\\jdbhammer"+"-"+args[0]+"-"+args[1]+"-"+args[2]+"-"+args[3]+".txt"; System.out.println("Creating DB Pool."); try { Class.forName("org.postgresql.Driver"); } catch (Exception e) { System.out.println("Error! Unable to load JDBC Driver! Error was:" + e.getMessage()); return; }// try // create the pool GenericObjectPool connectionPool = new GenericObjectPool(null, Integer.parseInt(args[1]), GenericObjectPool.WHEN_EXHAUSTED_GROW, 0); DriverManagerConnectionFactory connectionFactory = new DriverManagerConnectionFactory("jdbc:postgresql://theserver/thedb", username, password); try { PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory,connectionPool,null,null,fal se,true); } catch (Exception e) { System.out.println("Error! Unable to create PoolableConnectionFactory! Error was:" + e.getMessage()); return; }// try PoolingDriver driver = new PoolingDriver(); driver.registerPool("jdbhammer",connectionPool); ArrayList clients = new ArrayList(); DbClient client = null; System.out.println("Creating Clients."); // load them for (int i=0, j=Integer.parseInt(args[0]); i < j; i++) { client = new DbClient("DbClient" + Integer.toString(i), resultsLocation); client.loadParents(Integer.parseInt(args[2]), Integer.parseInt(args[3])); System.out.println("Creating Clients: " +"DbClient" + Integer.toString(i)); clients.add(client); }// for System.out.println("Starting Threads."); Thread[] t = new Thread[clients.size()]; for (int i=0, j=clients.size(); i < j; i++) { client = (DbClient) clients.get(i); t[i] = new Thread(client, client.getClientId()); t[i].start(); }// for }// main }// Main // DBClient private ArrayList workload = new ArrayList(10000); private String clientId = null; private long startTime = 0L; private long endTime = 0L; private boolean isComplete = Boolean.FALSE.booleanValue(); private static final String procInsertParent = "{ call proc_insert_parent( ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ) }"; private static final String procInsertChild = "{ call proc_insert_child( ?,?,?,?,?,?,?,?,?,?,?,?,? ) }"; private String resultsLocation = null; private Connection conn = null; private CallableStatement parentCall = null; private CallableStatement childCall = null; public DbClient(String clientId, String resultsLocation) { this.clientId = clientId; this.resultsLocation = resultsLocation; try { System.out.println("grabbing connection"); conn = DriverManager.getConnection("jdbc:apache:commons:dbcp:jdbhammer"); conn.setAutoCommit(false); parentCall = conn.prepareCall(procInsertParent); childCall = conn.prepareCall(procInsertChild); } catch (SQLException sql) { System.out.println("Error! There was an error creating the connection. Error was: " + sql.getMessage()); } // try } // DbClient public final void run() { Parent p = null; Child c = null; ArrayList children = null; startTime = System.currentTimeMillis(); try { for (int i = 0, j = workload.size(); i < j; i++) { p = (Parent) workload.get(i); try { p.setStartTime(System.currentTimeMillis()); p.insert(parentCall); p.setEndTime(System.currentTimeMillis()); } catch (SQLException sql) { System.out.println("Error! " + sql.getMessage()); continue; // skip the children } // try children = p.getChildren(); for (int k = 0, m = children.size(); k < m; k++) { child = (Child) children.get(k); try { child.setStartTime(System.currentTimeMillis()); child.insert(childCall); child.setEndTime(System.currentTimeMillis()); } catch (SQLException sql) { System.out.println("Error! " + sql.getMessage()); // do nothing, keep on running } // try } // for if ((i + 1 == j)) { conn.commit(); } // if } // for } catch (SQLException sql) { System.out.println("Error! " + sql.getMessage()); try { conn.rollback(); } catch (SQLException sqle) { } } finally { try { parentCall.close(); childCall.close(); conn.close(); } catch (SQLException sql) { } } endTime = System.currentTimeMillis(); isComplete = Boolean.TRUE.booleanValue(); // done System.out.println(Thread.currentThread().getName() + " finished!"); writeOutput(); } // run The parent and child insert() method sets a number of parameters one each callable statement, and then execute() a function on the PostgreSQL server, resulting in a row being inserted into a table. Let me know what other information I can provide, George -----Original Message----- From: Dave Cramer [mailto:pg@fastcrypt.com] Sent: Wednesday, December 31, 2003 2:28 PM To: George Lessmann Cc: pgsql-jdbc@postgresql.org Subject: Re: [JDBC] odd jdbc driver synchronization issue One thing that would help is the code? Dave On Wed, 2003-12-31 at 15:06, George Lessmann wrote: > Hi, > > I'm trying to move my database platform from MSSQL Server to PostgreSQL. > I have a load simulation program I wrote which I'm running against a > test PostgreSQL instance. The application creates a number of client > threads, each with their own database connection, and turns them loose > on a workload. Currently, it's lagging the SQLServer test. I'm still > tuning the postgresql.conf file, but I also noticed something very odd > wrt the postmaster process. I see something like the following: > > 3 threads started, 0 done, > pid 1 99% > pid 2 0% > pid 3 0% > > 2 threads started, 1 done, > pid 1 0% > pid 2 99% > pid 3 0% > > 1 threads started, 2 done, > pid 1 0% > pid 2 0% > pid 3 99% > > Even though all the treads are runnable, with their own connection, and > their own postmaster process on the DB, they are still serializing their > writes. If I look in the table where the data is being generated, I see > rows inserted in order similar to what top is showing (Client3's data, > then Client6's data, then Client1's data, etc). > > As this application is written in java and using the PostgreSQL jdbc > driver I'm starting here, if you feel I should post elsewhere, let me > know. > > Thanks, > > George > > --Details-- > > Client machine: > Windows XP, Java 1.4.2 (build 1.4.2-b28) > PostgreSQL JDBC driver 7.4, 7.4.1 (no difference) > > Database machine: > Debian Linux 2.6.0-test11 #4 SMP i686 GNU/Linux > 2x 2.4GHz Xeon w/HT, 1GB RAM > PostgreSQL 7.4 > > ---------------------------(end of broadcast)--------------------------- > TIP 3: if posting/reading through Usenet, please send an appropriate > subscribe-nomail command to majordomo@postgresql.org so that your > message can get through to the mailing list cleanly > -- Dave Cramer 519 939 0336 ICQ # 1467551
pgsql-jdbc by date: