Fix bug with closed database connections in very long running requests by making sure connections are re-checked every 10 seconds.

This commit is contained in:
hns 2008-10-17 16:20:15 +00:00
parent f099d9ae69
commit 9a0a61e698

View file

@ -55,7 +55,7 @@ public class Transactor {
private Map sqlConnections; private Map sqlConnections;
// Set of SQL connections that already have been verified // Set of SQL connections that already have been verified
private Set testedConnections; private Map testedConnections;
// when did the current transaction start? // when did the current transaction start?
private long tstart; private long tstart;
@ -82,7 +82,7 @@ public class Transactor {
parentNodes = new HashSet(); parentNodes = new HashSet();
sqlConnections = new HashMap(); sqlConnections = new HashMap();
testedConnections = new HashSet(); testedConnections = new HashMap();
active = false; active = false;
killed = false; killed = false;
} }
@ -242,7 +242,7 @@ public class Transactor {
public void registerConnection(DbSource src, Connection con) { public void registerConnection(DbSource src, Connection con) {
sqlConnections.put(src, con); sqlConnections.put(src, con);
// we assume a freshly created connection is ok. // we assume a freshly created connection is ok.
testedConnections.add(src); testedConnections.put(src, new Long(System.currentTimeMillis()));
} }
/** /**
@ -252,13 +252,15 @@ public class Transactor {
*/ */
public Connection getConnection(DbSource src) { public Connection getConnection(DbSource src) {
Connection con = (Connection) sqlConnections.get(src); Connection con = (Connection) sqlConnections.get(src);
if (con != null && !testedConnections.contains(src)) { Long tested = (Long) testedConnections.get(src);
long now = System.currentTimeMillis();
if (con != null && (tested == null || now - tested.longValue() > 10000)) {
// Check if the connection is still alive by executing a simple statement. // Check if the connection is still alive by executing a simple statement.
try { try {
Statement stmt = con.createStatement(); Statement stmt = con.createStatement();
stmt.execute("SELECT 1"); stmt.execute("SELECT 1");
stmt.close(); stmt.close();
testedConnections.add(src); testedConnections.put(src, new Long(now));
} catch (SQLException sx) { } catch (SQLException sx) {
try { try {
con.close(); con.close();