I’m working on a Tomcat 6.0 application currently set up to use JNDI connection pooling. We thought everything was working great until we started to load the server with concurrent requests. It seems our connection pool is blocking requests at the DataSource.getConnection call and waiting on a single connection to pass around.
Here’s our set-up:
From context.xml
<Resource name="jdbc/MoleComp" auth="Container"
type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="-1"
username="domain\user" password="xxxx"
driverClassName="sun.jdbc.odbc.JdbcOdbcDriver"
url="jdbc:odbc:MolecularComplaint"/>
From web.xml
<resource-ref>
<description>DB connection</description>
<res-ref-name>jdbc/MoleComp</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
From one of the servlets
Context initContext = new InitialContext();
Context env = (Context) initContext.lookup("java:comp/env");
DataSource ds =(DataSource) env.lookup("jdbc/MoleComp");
System.out.println("got ds");System.out.flush();
Connection conn = ds.getConnection();
System.out.println("got conn");System.out.flush();
sql = "SELECT TOP 1 PullDate,convert(varchar,PullDate,101) as lastDate,Status FROM IsisPull ORDER BY PullDate DESC";
PreparedStatement stmt = conn.prepareStatement(sql);
etc...
conn.close()
Now as request 1 is running, request 2 will block at “got ds” (it prints to /var/log/catalina.out) until request 1 closes it’s connection, at which point request 2 moves ahead.
Specs:
Tomcat 6 on a Gentoo Linux server talking to Sql Server 2005 on Windows 2003 using unixODBC and freeTDS driver.
What am I missing here?
Thanks,
Mark