From b5abf1f352cfd1e36e21b960746b54616526276c Mon Sep 17 00:00:00 2001 From: dsyer Date: Tue, 2 Feb 2010 22:07:15 +0000 Subject: [PATCH] BATCH-1502: Only open session once. --- .../database/HibernateItemReaderHelper.java | 10 ++- .../HibernateItemReaderHelperTests.java | 75 +++++++++++++++++++ ...PagingItemReaderOrderIntegrationTests.java | 45 +++++++++++ 3 files changed, 128 insertions(+), 2 deletions(-) create mode 100644 spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/HibernateItemReaderHelperTests.java create mode 100644 spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/JdbcPagingItemReaderOrderIntegrationTests.java diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/HibernateItemReaderHelper.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/HibernateItemReaderHelper.java index 97d4c4afe..9e32b3e4a 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/HibernateItemReaderHelper.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/HibernateItemReaderHelper.java @@ -134,7 +134,9 @@ public class HibernateItemReaderHelper implements InitializingBean { public Query createQuery() { if (useStatelessSession) { - statelessSession = sessionFactory.openStatelessSession(); + if (statelessSession==null) { + statelessSession = sessionFactory.openStatelessSession(); + } if (queryProvider != null) { queryProvider.setStatelessSession(statelessSession); } @@ -148,7 +150,9 @@ public class HibernateItemReaderHelper implements InitializingBean { } } else { - statefulSession = sessionFactory.openSession(); + if (statefulSession==null) { + statefulSession = sessionFactory.openSession(); + } if (queryProvider != null) { queryProvider.setSession(statefulSession); } @@ -187,9 +191,11 @@ public class HibernateItemReaderHelper implements InitializingBean { public void close() { if (statelessSession != null) { statelessSession.close(); + statelessSession = null; } if (statefulSession != null) { statefulSession.close(); + statefulSession = null; } } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/HibernateItemReaderHelperTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/HibernateItemReaderHelperTests.java new file mode 100644 index 000000000..5dc387cfc --- /dev/null +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/HibernateItemReaderHelperTests.java @@ -0,0 +1,75 @@ +/* + * Copyright 2006-2009 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.batch.item.database; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +import org.easymock.EasyMock; +import org.hibernate.SessionFactory; +import org.hibernate.StatelessSession; +import org.junit.Test; +import org.springframework.test.util.ReflectionTestUtils; + + +/** + * @author Dave Syer + * + */ +public class HibernateItemReaderHelperTests { + + private HibernateItemReaderHelper helper = new HibernateItemReaderHelper(); + + private SessionFactory sessionFactory = EasyMock.createMock(SessionFactory.class); + + @Test + public void testOneSessionForAllPages() throws Exception { + + StatelessSession session = EasyMock.createNiceMock(StatelessSession.class); + EasyMock.expect(sessionFactory.openStatelessSession()).andReturn(session); + EasyMock.replay(sessionFactory, session); + + helper.setSessionFactory(sessionFactory); + + helper.createQuery(); + // Multiple calls to createQuery only creates one session + helper.createQuery(); + + EasyMock.verify(sessionFactory, session); + + } + + @Test + public void testSessionReset() throws Exception { + + StatelessSession session = EasyMock.createNiceMock(StatelessSession.class); + EasyMock.expect(sessionFactory.openStatelessSession()).andReturn(session); + EasyMock.replay(sessionFactory, session); + + helper.setSessionFactory(sessionFactory); + + helper.createQuery(); + assertNotNull(ReflectionTestUtils.getField(helper, "statelessSession")); + + helper.close(); + assertNull(ReflectionTestUtils.getField(helper, "statelessSession")); + + EasyMock.verify(sessionFactory, session); + + } + +} diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/JdbcPagingItemReaderOrderIntegrationTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/JdbcPagingItemReaderOrderIntegrationTests.java new file mode 100644 index 000000000..4cf4b3ac7 --- /dev/null +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/JdbcPagingItemReaderOrderIntegrationTests.java @@ -0,0 +1,45 @@ +package org.springframework.batch.item.database; + +import java.sql.ResultSet; +import java.sql.SQLException; + +import org.springframework.batch.item.ItemReader; +import org.springframework.batch.item.database.support.HsqlPagingQueryProvider; +import org.springframework.batch.item.sample.Foo; +import org.springframework.jdbc.core.simple.ParameterizedRowMapper; + +/** + * Tests for {@link JpaPagingItemReader} with sort key not equal to ID. + * + * @author Thomas Risberg + */ +public class JdbcPagingItemReaderOrderIntegrationTests extends AbstractGenericDataSourceItemReaderIntegrationTests { + + protected ItemReader createItemReader() throws Exception { + + JdbcPagingItemReader inputSource = new JdbcPagingItemReader(); + inputSource.setDataSource(dataSource); + HsqlPagingQueryProvider queryProvider = new HsqlPagingQueryProvider(); + queryProvider.setSelectClause("select ID, NAME, VALUE"); + queryProvider.setFromClause("from T_FOOS"); + queryProvider.setSortKey("VALUE"); + inputSource.setQueryProvider(queryProvider); + inputSource.setRowMapper( + new ParameterizedRowMapper() { + public Foo mapRow(ResultSet rs, int i) throws SQLException { + Foo foo = new Foo(); + foo.setId(rs.getInt(1)); + foo.setName(rs.getString(2)); + foo.setValue(rs.getInt(3)); + return foo; + } + } + ); + inputSource.setPageSize(3); + inputSource.afterPropertiesSet(); + inputSource.setSaveState(true); + + return inputSource; + } + +}