Author: reschke
Date: Thu Sep 17 11:03:57 2015
New Revision: 1703570
URL: http://svn.apache.org/r1703570
Log:
OAK-3413: RDBDocumentStorePerformanceTest - fix leak of PreparedStatements
(ported to 1.2)
Modified:
jackrabbit/oak/branches/1.2/ (props changed)
jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStorePerformanceTest.java
Propchange: jackrabbit/oak/branches/1.2/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Sep 17 11:03:57 2015
@@ -1,3 +1,3 @@
/jackrabbit/oak/branches/1.0:1665962
-/jackrabbit/oak/trunk:1672350,1672468,1672537,1672603,1672642,1672644,1672834-1672835,1673351,1673410,1673414-1673415,1673436,1673644,1673662-1673664,1673669,1673695,1673713,1673738,1673787,1673791,1674046,1674065,1674075,1674107,1674228,1674780,1674880,1675054-1675055,1675319,1675332,1675354,1675357,1675382,1675555,1675566,1675593,1676198,1676237,1676407,1676458,1676539,1676670,1676693,1676703,1676725,1677579,1677581,1677609,1677611,1677774,1677788,1677797,1677804,1677806,1677939,1677991,1678023,1678095-1678096,1678124,1678171,1678173,1678211,1678323,1678758,1678938,1678954,1679144,1679165,1679191,1679232,1679235,1679503,1679958,1679961,1680170,1680172,1680182,1680222,1680232,1680236,1680461,1680633,1680643,1680747,1680805-1680806,1680903,1681282,1681767,1681918,1681955,1682042,1682218,1682235,1682437,1682494,1682555,1682855,1682904,1683059,1683089,1683213,1683249,1683259,1683278,1683323,1683687,1683700,1684174-1684175,1684186,1684376,1684442,1684561,1684570,1684601,1684618,1684820
,1684868,1685023,1685075,1685370,1685552,1685589-1685590,1685840,1685964,1685977,1685989,1685999,1686023,1686032,1686097,1686162,1686229,1686234,1686253,1686414,1686780,1686854,1686857,1686971,1687053-1687055,1687175,1687196,1687198,1687220,1687239-1687240,1687301,1687441,1687553,1688089-1688090,1688172,1688179,1688349,1688421,1688436,1688453,1688616,1688622,1688634,1688636,1688817,1689003-1689004,1689008,1689577,1689581,1689623,1689810,1689828,1689831,1689833,1689903,1690017,1690043,1690047,1690057,1690247,1690249,1690634-1690637,1690650,1690669,1690674,1690885,1690941,1691139,1691151,1691159,1691167,1691183,1691188,1691210,1691280,1691307,1691331-1691333,1691345,1691384-1691385,1691401,1691509,1692133-1692134,1692156,1692250,1692274,1692363,1692382,1692478,1692955,1693002,1693030,1693209,1693421,1693525-1693526,1694007,1694393-1694394,1695050,1695122,1695280,1695299,1695457,1695482,1695507,1695521,1695540,1696194,1696242,1696285,1696578,1696759,1696916,1697363,1697373,1697410,1697
582,1697589,1697616,1697672,1700191,1700231,1700397,1700403,1700506,1700571,1700727,1700749,1700769,1700775,1701065,1701619,1701733,1701743,1701750,1701768,1701806,1701810,1701814,1701948,1701955,1701959,1701986,1702022,1702272,1702387,1702405,1702423,1702860,1702942,1702960,1703212,1703382,1703395,1703411,1703428,1703430
+/jackrabbit/oak/trunk:1672350,1672468,1672537,1672603,1672642,1672644,1672834-1672835,1673351,1673410,1673414-1673415,1673436,1673644,1673662-1673664,1673669,1673695,1673713,1673738,1673787,1673791,1674046,1674065,1674075,1674107,1674228,1674780,1674880,1675054-1675055,1675319,1675332,1675354,1675357,1675382,1675555,1675566,1675593,1676198,1676237,1676407,1676458,1676539,1676670,1676693,1676703,1676725,1677579,1677581,1677609,1677611,1677774,1677788,1677797,1677804,1677806,1677939,1677991,1678023,1678095-1678096,1678124,1678171,1678173,1678211,1678323,1678758,1678938,1678954,1679144,1679165,1679191,1679232,1679235,1679503,1679958,1679961,1680170,1680172,1680182,1680222,1680232,1680236,1680461,1680633,1680643,1680747,1680805-1680806,1680903,1681282,1681767,1681918,1681955,1682042,1682218,1682235,1682437,1682494,1682555,1682855,1682904,1683059,1683089,1683213,1683249,1683259,1683278,1683323,1683687,1683700,1684174-1684175,1684186,1684376,1684442,1684561,1684570,1684601,1684618,1684820
,1684868,1685023,1685075,1685370,1685552,1685589-1685590,1685840,1685964,1685977,1685989,1685999,1686023,1686032,1686097,1686162,1686229,1686234,1686253,1686414,1686780,1686854,1686857,1686971,1687053-1687055,1687175,1687196,1687198,1687220,1687239-1687240,1687301,1687441,1687553,1688089-1688090,1688172,1688179,1688349,1688421,1688436,1688453,1688616,1688622,1688634,1688636,1688817,1689003-1689004,1689008,1689577,1689581,1689623,1689810,1689828,1689831,1689833,1689903,1690017,1690043,1690047,1690057,1690247,1690249,1690634-1690637,1690650,1690669,1690674,1690885,1690941,1691139,1691151,1691159,1691167,1691183,1691188,1691210,1691280,1691307,1691331-1691333,1691345,1691384-1691385,1691401,1691509,1692133-1692134,1692156,1692250,1692274,1692363,1692382,1692478,1692955,1693002,1693030,1693209,1693421,1693525-1693526,1694007,1694393-1694394,1695050,1695122,1695280,1695299,1695457,1695482,1695507,1695521,1695540,1696194,1696242,1696285,1696578,1696759,1696916,1697363,1697373,1697410,1697
582,1697589,1697616,1697672,1700191,1700231,1700397,1700403,1700506,1700571,1700727,1700749,1700769,1700775,1701065,1701619,1701733,1701743,1701750,1701768,1701806,1701810,1701814,1701948,1701955,1701959,1701986,1702022,1702272,1702387,1702405,1702423,1702860,1702942,1702960,1703212,1703382,1703395,1703411,1703428,1703430,1703568
/jackrabbit/trunk:1345480
Modified:
jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStorePerformanceTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStorePerformanceTest.java?rev=1703570&r1=1703569&r2=1703570&view=diff
==============================================================================
---
jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStorePerformanceTest.java
(original)
+++
jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStorePerformanceTest.java
Thu Sep 17 11:03:57 2015
@@ -31,7 +31,6 @@ import java.util.UUID;
import org.apache.jackrabbit.oak.plugins.document.AbstractDocumentStoreTest;
import org.apache.jackrabbit.oak.plugins.document.DocumentStoreException;
import org.apache.jackrabbit.oak.plugins.document.DocumentStoreFixture;
-import org.apache.jackrabbit.oak.plugins.document.DocumentStorePerformanceTest;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -40,17 +39,19 @@ import org.slf4j.LoggerFactory;
* Tests measuring the performance of various {@link RDBDocumentStore}
* operations.
* <p>
- * These tests are disabled by default due to their long running time. On the
command line
- * specify {@code -DRDBDocumentStorePerformanceTest=true} to enable them.
+ * These tests are disabled by default due to their long running time. On the
+ * command line specify {@code -DRDBDocumentStorePerformanceTest=true} to
enable
+ * them.
*/
public class RDBDocumentStorePerformanceTest extends AbstractDocumentStoreTest
{
private static final Logger LOG =
LoggerFactory.getLogger(RDBDocumentStorePerformanceTest.class);
- private static final boolean ENABLED =
Boolean.getBoolean(DocumentStorePerformanceTest.class.getSimpleName());
+ private static final boolean ENABLED =
Boolean.getBoolean(RDBDocumentStorePerformanceTest.class.getSimpleName());
public RDBDocumentStorePerformanceTest(DocumentStoreFixture dsf) {
super(dsf);
assumeTrue(ENABLED);
+ assumeTrue(super.rdbDataSource != null);
}
@Test
@@ -79,218 +80,195 @@ public class RDBDocumentStorePerformance
}
private void internalTestPerfUpdateLimit(String name, String desc, int
mode) throws SQLException, UnsupportedEncodingException {
- if (super.rdbDataSource != null) {
- String key = name;
- Connection connection = null;
- String table = DocumentStoreFixture.TABLEPREFIX + "NODES";
-
- // create test node
+ String key = name;
+ Connection connection = null;
+ String table = DocumentStoreFixture.TABLEPREFIX + "NODES";
+
+ // create test node
+ try {
+ connection = super.rdbDataSource.getConnection();
+ connection.setAutoCommit(false);
+ // we use the same pool as the document store, and the
+ // connection might have been returned in read-only mode
+ connection.setReadOnly(false);
+ PreparedStatement stmt = connection.prepareStatement("insert into
" + table + " (ID, MODCOUNT, DATA) values (?, ?, ?)");
try {
- connection = super.rdbDataSource.getConnection();
- connection.setAutoCommit(false);
- // we use the same pool as the document store, and the
- // connection might have been returned in read-only mode
- connection.setReadOnly(false);
- PreparedStatement stmt = connection.prepareStatement("insert
into " + table
- + " (ID, MODCOUNT, DATA) values (?, ?, ?)");
- try {
- setIdInStatement(stmt, 1, key);
- stmt.setLong(2, 0);
- stmt.setString(3, "X");
- stmt.executeUpdate();
- connection.commit();
- } finally {
- stmt.close();
- }
- } catch (SQLException ex) {
- // ignored
- // ex.printStackTrace();
+ setIdInStatement(stmt, 1, key);
+ stmt.setLong(2, 0);
+ stmt.setString(3, "X");
+ stmt.executeUpdate();
+ connection.commit();
} finally {
- if (connection != null) {
- try {
- connection.close();
- } catch (SQLException e) {
- // ignored
- }
- }
+ stmt = close(stmt);
}
+ } catch (SQLException ex) {
+ // ignored
+ // ex.printStackTrace();
+ } finally {
+ connection = close(connection);
+ }
- removeMe.add(key);
- StringBuffer expect = new StringBuffer("X");
+ removeMe.add(key);
+ StringBuffer expect = new StringBuffer("X");
- String appendString = generateString(512, true);
+ String appendString = generateString(512, true);
- long duration = 1000;
- long end = System.currentTimeMillis() + duration;
- long cnt = 0;
- byte bdata[] = new byte[65536];
- String sdata = appendString;
- boolean needsConcat = super.dsname.contains("MySQL");
- boolean needsSQLStringConcat = super.dsname.contains("MSSql");
- int dataInChars = ((super.dsname.contains("Oracle") ||
(super.dsname.contains("MSSql"))) ? 4000 : 16384);
- int dataInBytes = dataInChars / 3;
+ long duration = 1000;
+ long end = System.currentTimeMillis() + duration;
+ long cnt = 0;
+ byte bdata[] = new byte[65536];
+ String sdata = appendString;
+ boolean needsConcat = super.dsname.contains("MySQL");
+ boolean needsSQLStringConcat = super.dsname.contains("MSSql");
+ int dataInChars = ((super.dsname.contains("Oracle") ||
(super.dsname.contains("MSSql"))) ? 4000 : 16384);
+ int dataInBytes = dataInChars / 3;
- while (System.currentTimeMillis() < end) {
+ while (System.currentTimeMillis() < end) {
- try {
- connection = super.rdbDataSource.getConnection();
- connection.setAutoCommit(false);
+ try {
+ connection = super.rdbDataSource.getConnection();
+ connection.setAutoCommit(false);
- if (mode == 0) {
- PreparedStatement stmt =
connection.prepareStatement("update " + table + " set MODCOUNT = ? where ID =
?");
- try {
- stmt.setLong(1, cnt);
- setIdInStatement(stmt, 2, key);
- assertEquals(1, stmt.executeUpdate());
- connection.commit();
- } finally {
- stmt.close();
- }
- } else if (mode == 1) {
- PreparedStatement stmt =
connection.prepareStatement("update " + table
- + " set MODCOUNT = ?, DATA = ? where ID = ?");
- try {
- stmt.setLong(1, cnt);
- stmt.setString(2, "JSON data " +
UUID.randomUUID());
- setIdInStatement(stmt, 3, key);
- assertEquals(1, stmt.executeUpdate());
- connection.commit();
- } finally {
- stmt.close();
- }
- } else if (mode == 2) {
- PreparedStatement stmt =
connection.prepareStatement("update " + table
- + " set MODCOUNT = ?, DATA = ?, BDATA = ?
where ID = ?");
- try {
- stmt.setLong(1, cnt);
- stmt.setString(2, "JSON data " +
UUID.randomUUID());
- bdata[(int) cnt % bdata.length] = (byte) (cnt &
0xff);
- stmt.setString(2, "JSON data " +
UUID.randomUUID());
- stmt.setBytes(3, bdata);
- setIdInStatement(stmt, 4, key);
- assertEquals(1, stmt.executeUpdate());
- connection.commit();
- } finally {
- stmt.close();
- }
- } else if (mode == 3) {
- String t = "update " + table + " ";
+ if (mode == 0) {
+ PreparedStatement stmt =
connection.prepareStatement("update " + table + " set MODCOUNT = ? where ID =
?");
+ try {
+ stmt.setLong(1, cnt);
+ setIdInStatement(stmt, 2, key);
+ assertEquals(1, stmt.executeUpdate());
+ connection.commit();
+ } finally {
+ stmt = close(stmt);
+ }
+ } else if (mode == 1) {
+ PreparedStatement stmt = connection
+ .prepareStatement("update " + table + " set
MODCOUNT = ?, DATA = ? where ID = ?");
+ try {
+ stmt.setLong(1, cnt);
+ stmt.setString(2, "JSON data " + UUID.randomUUID());
+ setIdInStatement(stmt, 3, key);
+ assertEquals(1, stmt.executeUpdate());
+ connection.commit();
+ } finally {
+ stmt = close(stmt);
+ }
+ } else if (mode == 2) {
+ PreparedStatement stmt = connection
+ .prepareStatement("update " + table + " set
MODCOUNT = ?, DATA = ?, BDATA = ? where ID = ?");
+ try {
+ stmt.setLong(1, cnt);
+ stmt.setString(2, "JSON data " + UUID.randomUUID());
+ bdata[(int) cnt % bdata.length] = (byte) (cnt & 0xff);
+ stmt.setString(2, "JSON data " + UUID.randomUUID());
+ stmt.setBytes(3, bdata);
+ setIdInStatement(stmt, 4, key);
+ assertEquals(1, stmt.executeUpdate());
+ connection.commit();
+ } finally {
+ stmt = close(stmt);
+ }
+ } else if (mode == 3) {
+ String t = "update " + table + " ";
- t += "set DATA = ";
- if (needsConcat) {
- t += "CONCAT(DATA, ?) ";
- } else if (needsSQLStringConcat) {
- t += "CASE WHEN LEN(DATA) <= " + (dataInChars -
appendString.length())
- + " THEN (DATA + CAST(? AS nvarchar(" +
4000
- + "))) ELSE (DATA + CAST(DATA AS
nvarchar(max))) END";
- } else {
- t += "DATA || CAST(? as varchar(" + dataInChars +
"))";
- }
+ t += "set DATA = ";
+ if (needsConcat) {
+ t += "CONCAT(DATA, ?) ";
+ } else if (needsSQLStringConcat) {
+ t += "CASE WHEN LEN(DATA) <= " + (dataInChars -
appendString.length()) + " THEN (DATA + CAST(? AS nvarchar("
+ + 4000 + "))) ELSE (DATA + CAST(DATA AS
nvarchar(max))) END";
+ } else {
+ t += "DATA || CAST(? as varchar(" + dataInChars + "))";
+ }
- t += " where ID = ?";
+ t += " where ID = ?";
- PreparedStatement stmt =
connection.prepareStatement(t);
- try {
- stmt.setString(1, appendString);
+ PreparedStatement stmt = connection.prepareStatement(t);
+ try {
+ stmt.setString(1, appendString);
+ setIdInStatement(stmt, 2, key);
+ assertEquals(1, stmt.executeUpdate());
+ connection.commit();
+ expect.append(appendString);
+ } catch (SQLException ex) {
+ // ex.printStackTrace();
+ String state = ex.getSQLState();
+ if ("22001".equals(state)
+ /* everybody */ || ("72000".equals(state) &&
1489 == ex.getErrorCode()) /* Oracle */) {
+ // overflow
+ stmt = close(stmt);
+ connection.rollback();
+ stmt = connection
+ .prepareStatement("update " + table + "
set MODCOUNT = MODCOUNT + 1, DATA = ? where ID = ?");
+ stmt.setString(1, "X");
setIdInStatement(stmt, 2, key);
assertEquals(1, stmt.executeUpdate());
connection.commit();
- expect.append(appendString);
- } catch (SQLException ex) {
+ expect = new StringBuffer("X");
+ } else {
// ex.printStackTrace();
- String state = ex.getSQLState();
- if ("22001".equals(state) /* everybody */||
("72000".equals(state) && 1489 == ex.getErrorCode()) /* Oracle */) {
- // overflow
- connection.rollback();
- stmt = connection.prepareStatement("update " +
table
- + " set MODCOUNT = MODCOUNT + 1, DATA
= ? where ID = ?");
- stmt.setString(1, "X");
- setIdInStatement(stmt, 2, key);
- assertEquals(1, stmt.executeUpdate());
- connection.commit();
- expect = new StringBuffer("X");
- } else {
- // ex.printStackTrace();
- throw (ex);
- }
- } finally {
- stmt.close();
+ throw (ex);
}
- } else if (mode == 4) {
- PreparedStatement stmt = connection
- .prepareStatement("update "
- + table
- + " set MODIFIED = ?, HASBINARY = ?,
MODCOUNT = ?, CMODCOUNT = ?, DSIZE = ?, DATA = ?, BDATA = ? where ID = ?");
- try {
- int si = 1;
- stmt.setObject(si++, System.currentTimeMillis() /
5, Types.BIGINT);
- stmt.setObject(si++, 0, Types.SMALLINT);
- stmt.setObject(si++, cnt, Types.BIGINT);
- stmt.setObject(si++, null, Types.BIGINT);
- stmt.setObject(si++, sdata.length(), Types.BIGINT);
-
- if (sdata.length() < dataInBytes) {
- stmt.setString(si++, sdata);
- stmt.setBinaryStream(si++, null, 0);
- } else {
- stmt.setString(si++, "null");
- stmt.setBytes(si++, sdata.getBytes("UTF-8"));
- }
- setIdInStatement(stmt, si++, key);
- assertEquals(1, stmt.executeUpdate());
- connection.commit();
- sdata += appendString;
- } finally {
- stmt.close();
- }
-
+ } finally {
+ stmt = close(stmt);
}
- } catch (SQLException ex) {
- LOG.error(ex.getMessage() + " " + ex.getSQLState() + " " +
ex.getErrorCode(), ex);
- } finally {
- if (connection != null) {
- try {
- connection.close();
- } catch (SQLException e) {
- // ignored
+ } else if (mode == 4) {
+ PreparedStatement stmt =
connection.prepareStatement("update " + table
+ + " set MODIFIED = ?, HASBINARY = ?, MODCOUNT = ?,
CMODCOUNT = ?, DSIZE = ?, DATA = ?, BDATA = ? where ID = ?");
+ try {
+ int si = 1;
+ stmt.setObject(si++, System.currentTimeMillis() / 5,
Types.BIGINT);
+ stmt.setObject(si++, 0, Types.SMALLINT);
+ stmt.setObject(si++, cnt, Types.BIGINT);
+ stmt.setObject(si++, null, Types.BIGINT);
+ stmt.setObject(si++, sdata.length(), Types.BIGINT);
+
+ if (sdata.length() < dataInBytes) {
+ stmt.setString(si++, sdata);
+ stmt.setBinaryStream(si++, null, 0);
+ } else {
+ stmt.setString(si++, "null");
+ stmt.setBytes(si++, sdata.getBytes("UTF-8"));
}
+ setIdInStatement(stmt, si++, key);
+ assertEquals(1, stmt.executeUpdate());
+ connection.commit();
+ sdata += appendString;
+ } finally {
+ stmt = close(stmt);
}
- }
- cnt += 1;
+ }
+ } catch (SQLException ex) {
+ LOG.error(ex.getMessage() + " " + ex.getSQLState() + " " +
ex.getErrorCode(), ex);
+ } finally {
+ connection = close(connection);
}
- // check persisted values
- if (mode == 3) {
+ cnt += 1;
+ }
+
+ // check persisted values
+ if (mode == 3) {
+ try {
+ connection = super.rdbDataSource.getConnection();
+ connection.setAutoCommit(false);
+ PreparedStatement stmt = connection.prepareStatement("select
DATA, MODCOUNT from " + table + " where ID = ?");
try {
- connection = super.rdbDataSource.getConnection();
- connection.setAutoCommit(false);
- PreparedStatement stmt =
connection.prepareStatement("select DATA, MODCOUNT from " + table + " where ID
= ?");
- try {
- setIdInStatement(stmt, 1, key);
- ResultSet 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 {
- stmt.close();
- }
+ setIdInStatement(stmt, 1, key);
+ ResultSet 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 {
- if (connection != null) {
- try {
- connection.close();
- } catch (SQLException e) {
- // ignored
- }
- }
+ stmt = close(stmt);
}
+ } finally {
+ connection = close(connection);
}
-
- LOG.info(desc + " for " + super.dsname + " was " + cnt + " in " +
duration + "ms (" + (cnt / (duration / 1000f))
- + "/s)");
}
+
+ LOG.info(desc + " for " + super.dsname + " was " + cnt + " in " +
duration + "ms (" + (cnt / (duration / 1000f)) + "/s)");
}
private void setIdInStatement(PreparedStatement stmt, int idx, String id)
throws SQLException {
@@ -306,4 +284,26 @@ public class RDBDocumentStorePerformance
stmt.setString(idx, id);
}
}
+
+ private static Connection close(Connection c) {
+ if (c != null) {
+ try {
+ c.close();
+ } catch (SQLException ex) {
+ // ignored
+ }
+ }
+ return null;
+ }
+
+ private static PreparedStatement close(PreparedStatement s) {
+ if (s != null) {
+ try {
+ s.close();
+ } catch (SQLException ex) {
+ // ignored
+ }
+ }
+ return null;
+ }
}