Merge pull request #87 from olivergierke/SPR-9457

* SPR-9457:
  Use transactional connection during db population
master
Chris Beams 12 years ago
commit 67d5a1238f
  1. 15
      spring-jdbc/src/main/java/org/springframework/jdbc/datasource/init/DatabasePopulatorUtils.java
  2. 33
      spring-jdbc/src/test/java/org/springframework/jdbc/datasource/init/DatabasePopulatorTests.java

@ -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.
@ -17,16 +17,18 @@
package org.springframework.jdbc.datasource.init; package org.springframework.jdbc.datasource.init;
import java.sql.Connection; import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource; import javax.sql.DataSource;
import org.springframework.dao.DataAccessResourceFailureException; import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.util.Assert; import org.springframework.util.Assert;
/** /**
* Utility methods for executing a DatabasePopulator. * Utility methods for executing a DatabasePopulator.
* *
* @author Juergen Hoeller * @author Juergen Hoeller
* @author Oliver Gierke
* @since 3.1 * @since 3.1
*/ */
public abstract class DatabasePopulatorUtils { public abstract class DatabasePopulatorUtils {
@ -40,16 +42,13 @@ public abstract class DatabasePopulatorUtils {
Assert.notNull(populator, "DatabasePopulator must be provided"); Assert.notNull(populator, "DatabasePopulator must be provided");
Assert.notNull(dataSource, "DataSource must be provided"); Assert.notNull(dataSource, "DataSource must be provided");
try { try {
Connection connection = dataSource.getConnection(); Connection connection = DataSourceUtils.getConnection(dataSource);
try { try {
populator.populate(connection); populator.populate(connection);
} }
finally { finally {
try { if (connection != null) {
connection.close(); DataSourceUtils.releaseConnection(connection, dataSource);
}
catch (SQLException ex) {
// ignore
} }
} }
} }

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2010 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.
@ -19,17 +19,24 @@ package org.springframework.jdbc.datasource.init;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import java.sql.Connection; import java.sql.Connection;
import java.sql.SQLException;
import org.easymock.EasyMock;
import org.junit.After; import org.junit.After;
import org.junit.Test; import org.junit.Test;
import org.springframework.core.io.ClassRelativeResourceLoader; import org.springframework.core.io.ClassRelativeResourceLoader;
import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.transaction.support.TransactionSynchronizationManager;
/** /**
* @author Dave Syer * @author Dave Syer
* @author Sam Brannen * @author Sam Brannen
* @author Oliver Gierke
*/ */
public class DatabasePopulatorTests { public class DatabasePopulatorTests {
@ -54,6 +61,12 @@ public class DatabasePopulatorTests {
@After @After
public void shutDown() { public void shutDown() {
if (TransactionSynchronizationManager.isSynchronizationActive()) {
TransactionSynchronizationManager.clear();
TransactionSynchronizationManager.unbindResource(db);
}
db.shutdown(); db.shutdown();
} }
@ -207,4 +220,22 @@ public class DatabasePopulatorTests {
assertEquals(1, jdbcTemplate.queryForInt("select COUNT(NAME) from T_TEST where NAME='Dave'")); assertEquals(1, jdbcTemplate.queryForInt("select COUNT(NAME) from T_TEST where NAME='Dave'"));
} }
/**
* @see SPR-9457
*/
@Test
public void usesBoundConnectionIfAvailable() throws SQLException {
TransactionSynchronizationManager.initSynchronization();
Connection connection = DataSourceUtils.getConnection(db);
DatabasePopulator populator = EasyMock.createMock(DatabasePopulator.class);
populator.populate(connection);
EasyMock.expectLastCall();
EasyMock.replay(populator);
DatabasePopulatorUtils.execute(populator, db);
EasyMock.verify(populator);
}
} }

Loading…
Cancel
Save