Backported "Work around JDK7 String#substring performance regression"
Issue: SPR-9781 Issue: SPR-9784
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002-2011 the original author or authors.
|
* Copyright 2002-2012 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -43,13 +43,14 @@ import org.springframework.util.StringUtils;
|
|||||||
* @author Dave Syer
|
* @author Dave Syer
|
||||||
* @author Juergen Hoeller
|
* @author Juergen Hoeller
|
||||||
* @author Chris Beams
|
* @author Chris Beams
|
||||||
|
* @author Oliver Gierke
|
||||||
* @since 3.0
|
* @since 3.0
|
||||||
*/
|
*/
|
||||||
public class ResourceDatabasePopulator implements DatabasePopulator {
|
public class ResourceDatabasePopulator implements DatabasePopulator {
|
||||||
|
|
||||||
private static String DEFAULT_COMMENT_PREFIX = "--";
|
private static final String DEFAULT_COMMENT_PREFIX = "--";
|
||||||
|
|
||||||
private static String DEFAULT_STATEMENT_SEPARATOR = ";";
|
private static final String DEFAULT_STATEMENT_SEPARATOR = ";";
|
||||||
|
|
||||||
private static final Log logger = LogFactory.getLog(ResourceDatabasePopulator.class);
|
private static final Log logger = LogFactory.getLog(ResourceDatabasePopulator.class);
|
||||||
|
|
||||||
@@ -265,7 +266,7 @@ public class ResourceDatabasePopulator implements DatabasePopulator {
|
|||||||
if (content[i] == '\'') {
|
if (content[i] == '\'') {
|
||||||
inLiteral = !inLiteral;
|
inLiteral = !inLiteral;
|
||||||
}
|
}
|
||||||
if (!inLiteral && script.substring(i).startsWith(delim)) {
|
if (!inLiteral && startsWithDelimiter(script, i, delim)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -273,8 +274,24 @@ public class ResourceDatabasePopulator implements DatabasePopulator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Split an SQL script into separate statements delimited with the provided delimiter character.
|
* Return whether the substring of a given source {@link String} starting at the
|
||||||
* Each individual statement will be added to the provided <code>List</code>.
|
* given index starts with the given delimiter.
|
||||||
|
* @param source the source {@link String} to inspect
|
||||||
|
* @param startIndex the index to look for the delimiter
|
||||||
|
* @param delim the delimiter to look for
|
||||||
|
*/
|
||||||
|
private boolean startsWithDelimiter(String source, int startIndex, String delim) {
|
||||||
|
int endIndex = startIndex + delim.length();
|
||||||
|
if (source.length() < endIndex) {
|
||||||
|
// String is too short to contain the delimiter
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return source.substring(startIndex, endIndex).equals(delim);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Split an SQL script into separate statements delimited with the provided delimiter
|
||||||
|
* character. Each individual statement will be added to the provided {@code List}.
|
||||||
* @param script the SQL script
|
* @param script the SQL script
|
||||||
* @param delim character delimiting each statement (typically a ';' character)
|
* @param delim character delimiting each statement (typically a ';' character)
|
||||||
* @param statements the List that will contain the individual statements
|
* @param statements the List that will contain the individual statements
|
||||||
@@ -301,7 +318,7 @@ public class ResourceDatabasePopulator implements DatabasePopulator {
|
|||||||
inLiteral = !inLiteral;
|
inLiteral = !inLiteral;
|
||||||
}
|
}
|
||||||
if (!inLiteral) {
|
if (!inLiteral) {
|
||||||
if (script.substring(i).startsWith(delim)) {
|
if (startsWithDelimiter(script, i, delim)) {
|
||||||
if (sb.length() > 0) {
|
if (sb.length() > 0) {
|
||||||
statements.add(sb.toString());
|
statements.add(sb.toString());
|
||||||
sb = new StringBuilder();
|
sb = new StringBuilder();
|
||||||
|
|||||||
@@ -41,11 +41,16 @@ import org.springframework.transaction.support.TransactionSynchronizationManager
|
|||||||
public class DatabasePopulatorTests {
|
public class DatabasePopulatorTests {
|
||||||
|
|
||||||
private final EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
|
private final EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
|
||||||
|
|
||||||
private final EmbeddedDatabase db = builder.build();
|
private final EmbeddedDatabase db = builder.build();
|
||||||
|
|
||||||
private final ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator();
|
private final ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator();
|
||||||
|
|
||||||
private final ClassRelativeResourceLoader resourceLoader = new ClassRelativeResourceLoader(getClass());
|
private final ClassRelativeResourceLoader resourceLoader = new ClassRelativeResourceLoader(getClass());
|
||||||
|
|
||||||
private final JdbcTemplate jdbcTemplate = new JdbcTemplate(db);
|
private final JdbcTemplate jdbcTemplate = new JdbcTemplate(db);
|
||||||
|
|
||||||
|
|
||||||
private void assertTestDatabaseCreated() {
|
private void assertTestDatabaseCreated() {
|
||||||
assertTestDatabaseCreated("Keith");
|
assertTestDatabaseCreated("Keith");
|
||||||
}
|
}
|
||||||
@@ -61,15 +66,14 @@ public class DatabasePopulatorTests {
|
|||||||
|
|
||||||
@After
|
@After
|
||||||
public void shutDown() {
|
public void shutDown() {
|
||||||
|
|
||||||
if (TransactionSynchronizationManager.isSynchronizationActive()) {
|
if (TransactionSynchronizationManager.isSynchronizationActive()) {
|
||||||
TransactionSynchronizationManager.clear();
|
TransactionSynchronizationManager.clear();
|
||||||
TransactionSynchronizationManager.unbindResource(db);
|
TransactionSynchronizationManager.unbindResource(db);
|
||||||
}
|
}
|
||||||
|
|
||||||
db.shutdown();
|
db.shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testBuildWithCommentsAndFailedDrop() throws Exception {
|
public void testBuildWithCommentsAndFailedDrop() throws Exception {
|
||||||
databasePopulator.addScript(resourceLoader.getResource("db-schema-failed-drop-comments.sql"));
|
databasePopulator.addScript(resourceLoader.getResource("db-schema-failed-drop-comments.sql"));
|
||||||
@@ -78,7 +82,8 @@ public class DatabasePopulatorTests {
|
|||||||
Connection connection = db.getConnection();
|
Connection connection = db.getConnection();
|
||||||
try {
|
try {
|
||||||
databasePopulator.populate(connection);
|
databasePopulator.populate(connection);
|
||||||
} finally {
|
}
|
||||||
|
finally {
|
||||||
connection.close();
|
connection.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,7 +97,8 @@ public class DatabasePopulatorTests {
|
|||||||
Connection connection = db.getConnection();
|
Connection connection = db.getConnection();
|
||||||
try {
|
try {
|
||||||
databasePopulator.populate(connection);
|
databasePopulator.populate(connection);
|
||||||
} finally {
|
}
|
||||||
|
finally {
|
||||||
connection.close();
|
connection.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,7 +112,8 @@ public class DatabasePopulatorTests {
|
|||||||
Connection connection = db.getConnection();
|
Connection connection = db.getConnection();
|
||||||
try {
|
try {
|
||||||
databasePopulator.populate(connection);
|
databasePopulator.populate(connection);
|
||||||
} finally {
|
}
|
||||||
|
finally {
|
||||||
connection.close();
|
connection.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,7 +127,8 @@ public class DatabasePopulatorTests {
|
|||||||
Connection connection = db.getConnection();
|
Connection connection = db.getConnection();
|
||||||
try {
|
try {
|
||||||
databasePopulator.populate(connection);
|
databasePopulator.populate(connection);
|
||||||
} finally {
|
}
|
||||||
|
finally {
|
||||||
connection.close();
|
connection.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,7 +144,8 @@ public class DatabasePopulatorTests {
|
|||||||
Connection connection = db.getConnection();
|
Connection connection = db.getConnection();
|
||||||
try {
|
try {
|
||||||
databasePopulator.populate(connection);
|
databasePopulator.populate(connection);
|
||||||
} finally {
|
}
|
||||||
|
finally {
|
||||||
connection.close();
|
connection.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -152,7 +161,8 @@ public class DatabasePopulatorTests {
|
|||||||
Connection connection = db.getConnection();
|
Connection connection = db.getConnection();
|
||||||
try {
|
try {
|
||||||
databasePopulator.populate(connection);
|
databasePopulator.populate(connection);
|
||||||
} finally {
|
}
|
||||||
|
finally {
|
||||||
connection.close();
|
connection.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -167,7 +177,8 @@ public class DatabasePopulatorTests {
|
|||||||
Connection connection = db.getConnection();
|
Connection connection = db.getConnection();
|
||||||
try {
|
try {
|
||||||
databasePopulator.populate(connection);
|
databasePopulator.populate(connection);
|
||||||
} finally {
|
}
|
||||||
|
finally {
|
||||||
connection.close();
|
connection.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -183,7 +194,8 @@ public class DatabasePopulatorTests {
|
|||||||
Connection connection = db.getConnection();
|
Connection connection = db.getConnection();
|
||||||
try {
|
try {
|
||||||
databasePopulator.populate(connection);
|
databasePopulator.populate(connection);
|
||||||
} finally {
|
}
|
||||||
|
finally {
|
||||||
connection.close();
|
connection.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -198,7 +210,8 @@ public class DatabasePopulatorTests {
|
|||||||
Connection connection = db.getConnection();
|
Connection connection = db.getConnection();
|
||||||
try {
|
try {
|
||||||
databasePopulator.populate(connection);
|
databasePopulator.populate(connection);
|
||||||
} finally {
|
}
|
||||||
|
finally {
|
||||||
connection.close();
|
connection.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -212,7 +225,8 @@ public class DatabasePopulatorTests {
|
|||||||
Connection connection = db.getConnection();
|
Connection connection = db.getConnection();
|
||||||
try {
|
try {
|
||||||
databasePopulator.populate(connection);
|
databasePopulator.populate(connection);
|
||||||
} finally {
|
}
|
||||||
|
finally {
|
||||||
connection.close();
|
connection.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -225,7 +239,6 @@ public class DatabasePopulatorTests {
|
|||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void usesBoundConnectionIfAvailable() throws SQLException {
|
public void usesBoundConnectionIfAvailable() throws SQLException {
|
||||||
|
|
||||||
TransactionSynchronizationManager.initSynchronization();
|
TransactionSynchronizationManager.initSynchronization();
|
||||||
Connection connection = DataSourceUtils.getConnection(db);
|
Connection connection = DataSourceUtils.getConnection(db);
|
||||||
|
|
||||||
@@ -238,4 +251,22 @@ public class DatabasePopulatorTests {
|
|||||||
|
|
||||||
EasyMock.verify(populator);
|
EasyMock.verify(populator);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see SPR-9781
|
||||||
|
*/
|
||||||
|
@Test(timeout = 1000)
|
||||||
|
public void executesHugeScriptInReasonableTime() throws SQLException {
|
||||||
|
databasePopulator.addScript(resourceLoader.getResource("db-schema.sql"));
|
||||||
|
databasePopulator.addScript(resourceLoader.getResource("db-test-data-huge.sql"));
|
||||||
|
|
||||||
|
Connection connection = db.getConnection();
|
||||||
|
try {
|
||||||
|
databasePopulator.populate(connection);
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
connection.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user