You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by re...@apache.org on 2016/07/18 16:17:04 UTC
svn commit: r1753262 - in /jackrabbit/oak/trunk/oak-core/src:
main/java/org/apache/jackrabbit/oak/plugins/document/rdb/
test/java/org/apache/jackrabbit/oak/plugins/document/rdb/
Author: reschke
Date: Mon Jul 18 16:17:04 2016
New Revision: 1753262
URL: http://svn.apache.org/viewvc?rev=1753262&view=rev
Log:
OAK-4559: make sure all ResultSets get explicitly closed in order to address Tomcat JDBC Pool issues with StatementCache interceptopr
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDataSourceFactory.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreDB.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStoreFriend.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStorePerformanceTest.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBPreparedStatementWrapper.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java?rev=1753262&r1=1753261&r2=1753262&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java Mon Jul 18 16:17:04 2016
@@ -76,6 +76,7 @@ public class RDBBlobStore extends Cachin
@Override
public void close() {
+ String dropped = "";
if (!this.tablesToBeDropped.isEmpty()) {
LOG.debug("attempting to drop: " + this.tablesToBeDropped);
for (String tname : this.tablesToBeDropped) {
@@ -87,30 +88,28 @@ public class RDBBlobStore extends Cachin
stmt = con.createStatement();
stmt.execute("drop table " + tname);
stmt.close();
- stmt = null;
con.commit();
+ dropped += tname + " ";
} catch (SQLException ex) {
+ LOG.debug("attempting to drop: " + tname, ex);
+ } finally {
closeStatement(stmt);
- LOG.debug("attempting to drop: " + tname);
}
} catch (SQLException ex) {
- LOG.debug("attempting to drop: " + tname);
+ LOG.debug("attempting to drop: " + tname, ex);
} finally {
- try {
- if (con != null) {
- con.close();
- }
- } catch (SQLException ex) {
- LOG.debug("on close ", ex);
- }
+ this.ch.closeConnection(con);
}
}
+ dropped = dropped.trim();
}
try {
this.ch.close();
} catch (IOException ex) {
LOG.error("closing connection handler", ex);
}
+ LOG.info("RDBBlobStore (" + OakVersion.getVersion() + ") closed"
+ + (dropped.isEmpty() ? "" : " (tables dropped: " + dropped + ")"));
}
@Override
@@ -187,7 +186,7 @@ public class RDBBlobStore extends Cachin
try {
checkStatement = con.prepareStatement("select ID from " + tableName + " where ID = ?");
checkStatement.setString(1, "0");
- checkStatement.executeQuery();
+ checkStatement.executeQuery().close();
checkStatement.close();
checkStatement = null;
con.commit();
@@ -289,15 +288,17 @@ public class RDBBlobStore extends Cachin
this.ch.rollbackConnection(con);
// the insert failed although it should have succeeded; see whether the blob already exists
prep = con.prepareStatement("select DATA from " + this.tnData + " where ID = ?");
+ ResultSet rs = null;
byte[] dbdata = null;
try {
prep.setString(1, id);
- ResultSet rs = prep.executeQuery();
+ rs = prep.executeQuery();
if (rs.next()) {
dbdata = rs.getBytes(1);
}
} finally {
- prep.close();
+ closeResultSet(rs);
+ closeStatement(prep);
}
if (dbdata == null) {
@@ -350,15 +351,17 @@ public class RDBBlobStore extends Cachin
try {
PreparedStatement prep = con.prepareStatement("select DATA from " + this.tnData + " where ID = ?");
+ ResultSet rs = null;
try {
prep.setString(1, id);
- ResultSet rs = prep.executeQuery();
+ rs = prep.executeQuery();
if (!rs.next()) {
throw new IOException("Datastore block " + id + " not found");
}
data = rs.getBytes(1);
} finally {
- prep.close();
+ closeResultSet(rs);
+ closeStatement(prep);
}
} finally {
con.commit();
@@ -378,15 +381,17 @@ public class RDBBlobStore extends Cachin
long start = System.nanoTime();
try {
PreparedStatement prep = con.prepareStatement("select DATA from " + this.tnData + " where ID = ?");
+ ResultSet rs = null;
try {
prep.setString(1, id);
- ResultSet rs = prep.executeQuery();
+ rs = prep.executeQuery();
if (!rs.next()) {
throw new IOException("Datastore block " + id + " not found");
}
data = rs.getBytes(1);
} finally {
- prep.close();
+ closeResultSet(rs);
+ closeStatement(prep);
}
getStatsCollector().downloaded(id, System.nanoTime() - start, TimeUnit.NANOSECONDS, data.length);
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDataSourceFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDataSourceFactory.java?rev=1753262&r1=1753261&r2=1753262&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDataSourceFactory.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDataSourceFactory.java Mon Jul 18 16:17:04 2016
@@ -77,10 +77,9 @@ public class RDBDataSourceFactory {
dsclazz.getMethod("setUsername", String.class).invoke(ds, username);
dsclazz.getMethod("setPassword", String.class).invoke(ds, passwd);
dsclazz.getMethod("setUrl", String.class).invoke(ds, url);
- // SHOULD also contain StatementCache, but see OAK-4559
String interceptors = System.getProperty(
"org.apache.jackrabbit.oak.plugins.document.rdb.RDBDataSourceFactory.jdbcInterceptors",
- "SlowQueryReport(threshold=10000);ConnectionState");
+ "SlowQueryReport(threshold=10000);ConnectionState;StatementCache");
if (!interceptors.isEmpty()) {
dsclazz.getMethod("setJdbcInterceptors", String.class).invoke(ds, interceptors);
}
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java?rev=1753262&r1=1753261&r2=1753262&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java Mon Jul 18 16:17:04 2016
@@ -981,7 +981,7 @@ public class RDBDocumentStore implements
}
String tableName = tmd.getName();
- PreparedStatement checkStatement = null, checkStatement2 = null;
+ PreparedStatement checkStatement = null;
ResultSet checkResultSet = null;
Statement creatStatement = null;
@@ -1030,6 +1030,9 @@ public class RDBDocumentStore implements
// table does not appear to exist
con.rollback();
+ PreparedStatement checkStatement2 = null;
+ ResultSet checkResultSet2 = null;
+
try {
creatStatement = con.createStatement();
creatStatement.execute(this.dbInfo.getTableCreationStatement(tableName));
@@ -1047,9 +1050,9 @@ public class RDBDocumentStore implements
checkStatement2 = con.prepareStatement("select * from " + tableName + " where ID = ?");
checkStatement2.setString(1, "0:/");
- ResultSet rs = checkStatement2.executeQuery();
+ checkResultSet2 = checkStatement2.executeQuery();
// try to discover size of DATA column and binary-ness of ID
- ResultSetMetaData met = rs.getMetaData();
+ ResultSetMetaData met = checkResultSet2.getMetaData();
obtainFlagsFromResultSetMeta(met, tmd);
if (col == Collection.NODES) {
@@ -1065,11 +1068,14 @@ public class RDBDocumentStore implements
LOG.error("Failed to create table " + tableName + " in " + dbname, ex2);
throw ex2;
}
+ finally {
+ closeResultSet(checkResultSet2);
+ closeStatement(checkStatement2);
+ }
}
finally {
closeResultSet(checkResultSet);
closeStatement(checkStatement);
- closeStatement(checkStatement2);
closeStatement(creatStatement);
}
}
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreDB.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreDB.java?rev=1753262&r1=1753261&r2=1753262&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreDB.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreDB.java Mon Jul 18 16:17:04 2016
@@ -131,7 +131,6 @@ public enum RDBDocumentStoreDB {
result.put("pg_encoding_to_char(encoding)", rs.getString(1));
result.put("datcollate", rs.getString(2));
}
- stmt.close();
con.commit();
} catch (SQLException ex) {
LOG.debug("while getting diagnostics", ex);
@@ -327,6 +326,7 @@ public enum RDBDocumentStoreDB {
while (rs.next()) {
result.put(rs.getString(1), rs.getString(2));
}
+ rs.close();
stmt.close();
con.commit();
} catch (SQLException ex) {
@@ -397,6 +397,7 @@ public enum RDBDocumentStoreDB {
while (rs.next()) {
result.put("collation_name", rs.getString(1));
}
+ rs.close();
stmt.close();
con.commit();
} catch (SQLException ex) {
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java?rev=1753262&r1=1753261&r2=1753262&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java Mon Jul 18 16:17:04 2016
@@ -513,6 +513,7 @@ public class RDBDocumentStoreJDBC {
}
PreparedStatement stmt = connection.prepareStatement(query.toString());
+ ResultSet rs = null;
List<RDBRow> result = new ArrayList<RDBRow>();
long dataTotal = 0, bdataTotal = 0;
try {
@@ -532,7 +533,7 @@ public class RDBDocumentStoreJDBC {
if (limit != Integer.MAX_VALUE) {
stmt.setFetchSize(limit);
}
- ResultSet rs = stmt.executeQuery();
+ rs = stmt.executeQuery();
while (rs.next() && result.size() < limit) {
String id = getIdFromRS(tmd, rs, 1);
@@ -552,7 +553,8 @@ public class RDBDocumentStoreJDBC {
bdataTotal += bdata == null ? 0 : bdata.length;
}
} finally {
- stmt.close();
+ closeResultSet(rs);
+ closeStatement(stmt);
}
long elapsed = System.currentTimeMillis() - start;
@@ -585,10 +587,11 @@ public class RDBDocumentStoreJDBC {
query.append(" where ").append(inClause.getStatementComponent());
PreparedStatement stmt = connection.prepareStatement(query.toString());
+ ResultSet rs = null;
stmt.setPoolable(false);
try {
inClause.setParameters(stmt, 1);
- ResultSet rs = stmt.executeQuery();
+ rs = stmt.executeQuery();
while (rs.next()) {
int col = 1;
@@ -618,7 +621,8 @@ public class RDBDocumentStoreJDBC {
throw (ex);
}
} finally {
- stmt.close();
+ closeResultSet(rs);
+ closeStatement(stmt);
}
}
return rows;
@@ -642,6 +646,7 @@ public class RDBDocumentStoreJDBC {
}
sql.append("from " + tmd.getName() + " where ID = ?");
PreparedStatement stmt = connection.prepareStatement(sql.toString());
+ ResultSet rs = null;
try {
int si = 1;
@@ -653,7 +658,7 @@ public class RDBDocumentStoreJDBC {
}
setIdInStatement(tmd, stmt, si, id);
- ResultSet rs = stmt.executeQuery();
+ rs = stmt.executeQuery();
if (rs.next()) {
long modified = readLongFromResultSet(rs, 1);
long modcount = readLongFromResultSet(rs, 2);
@@ -681,7 +686,8 @@ public class RDBDocumentStoreJDBC {
throw (ex);
}
} finally {
- stmt.close();
+ closeResultSet(rs);
+ closeStatement(stmt);
}
}
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStoreFriend.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStoreFriend.java?rev=1753262&r1=1753261&r2=1753262&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStoreFriend.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStoreFriend.java Mon Jul 18 16:17:04 2016
@@ -16,6 +16,7 @@
*/
package org.apache.jackrabbit.oak.plugins.document.rdb;
+import static org.apache.jackrabbit.oak.plugins.document.rdb.RDBJDBCTools.closeResultSet;
import static org.apache.jackrabbit.oak.plugins.document.rdb.RDBJDBCTools.closeStatement;
import java.io.IOException;
@@ -55,12 +56,14 @@ public class RDBBlobStoreFriend {
String id = StringUtils.convertBytesToHex(digest);
Connection con = ds.ch.getROConnection();
PreparedStatement prep = null;
+ ResultSet rs = null;
try {
prep = con.prepareStatement("select ID from " + ds.tnData + " where ID = ?");
prep.setString(1, id);
- ResultSet rs = prep.executeQuery();
+ rs = prep.executeQuery();
return rs.next();
} finally {
+ closeResultSet(rs);
closeStatement(prep);
con.commit();
ds.ch.closeConnection(con);
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStorePerformanceTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStorePerformanceTest.java?rev=1753262&r1=1753261&r2=1753262&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStorePerformanceTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStorePerformanceTest.java Mon Jul 18 16:17:04 2016
@@ -252,15 +252,17 @@ public class RDBDocumentStorePerformance
connection = super.rdbDataSource.getConnection();
connection.setAutoCommit(false);
PreparedStatement stmt = connection.prepareStatement("select DATA, MODCOUNT from " + table + " where ID = ?");
+ ResultSet rs = null;
try {
setIdInStatement(stmt, 1, key);
- ResultSet rs = stmt.executeQuery();
+ rs = stmt.executeQuery();
assertTrue("test record " + key + " not found in " + super.dsname, rs.next());
String got = rs.getString(1);
long modc = rs.getLong(2);
LOG.info("column reset " + modc + " times");
assertEquals(expect.toString(), got);
} finally {
+ rs = close(rs);
stmt = close(stmt);
}
} finally {
@@ -303,6 +305,17 @@ public class RDBDocumentStorePerformance
} catch (SQLException ex) {
// ignored
}
+ }
+ return null;
+ }
+
+ private static ResultSet close(ResultSet rs) {
+ if (rs != null) {
+ try {
+ rs.close();
+ } catch (SQLException ex) {
+ // ignored
+ }
}
return null;
}
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBPreparedStatementWrapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBPreparedStatementWrapper.java?rev=1753262&r1=1753261&r2=1753262&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBPreparedStatementWrapper.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBPreparedStatementWrapper.java Mon Jul 18 16:17:04 2016
@@ -98,7 +98,7 @@ public class RDBPreparedStatementWrapper
((RDBResultSetWrapper) resultSet).dumpResult(null);
} else {
((RDBResultSetWrapper) resultSet).dumpResult("(not closed!)");
- LOG.error("Wrapped statement " + statement + " failed to close associated ResultSet; call stack:",
+ LOG.error("Wrapped statement " + statement.getClass() + " failed to close associated ResultSet; call stack:",
new Exception("call stack"));
}
}