2009-02-17 3 views
5

Проект, над которым я работаю, использует прямой доступ к данным JDBC во всей его славе и не использует никаких транзакций. Я чувствую, что использование транзакций и упрощение способов написания методов доступа к данным важно, особенно с некоторыми изменениями, внесенными в настоящее время. Проект существует довольно давно и не подходит для структуры ORM. Он также использует много синглтонов (тьфу) и распутывает его, чтобы он мог использовать инъекцию зависимостей, и это было бы неплохой работой, и я не думаю, что могу убедить кого-то в том, что мы должны это сделать сейчас.Как сделать простые транзакции Spring JDBC за пределами контейнера IoC?

Мне нравится интерфейс Spring JDBC, в частности через его SimpleJdbcTemplate. Мой вопрос заключается в том, как включить некоторые простые (для каждого запроса на сервлет) для этого, без необходимости устанавливать что-либо программно в каждом способе доступа к данным или использовать контейнер Spring IoC или AOP. Я играл со своей собственной архитектурой, которая заканчивается интерфейсом, подобным SimpleJdbcTemplate, и может использовать одно-локальное подключение и транзакцию, когда обращения к ней выполняются в контексте запроса (через ServletRequestListener с ThreadLocal). Кажется, что он работает хорошо, но я думаю, что использование хорошей внешней библиотеки, такой как Spring JDBC, было бы предпочтительнее.

У кого-нибудь есть опыт?

ответ

5

Возможно, вы можете использовать TransactionTemplate и TransactionCallback, как описано в Programmatic Transaction Management?

+0

Это не работает так, как я думал, так как это потребует программной упаковки вызовов с использованием TransactionTemplate на более высоком уровне приложения, а не только при каждом вызове JdbcTemplate, если это возможно, использовать локальную транзакцию запроса. Однако он должен работать нормально. – ColinD

0

Весна обрабатывает транзакции для вас декларативно, без необходимости беспокоиться о написании классов AOP. Если вы используете JDK 5 или выше и Spring 2.5, у вас есть еще лучше с annotations.

Я бы не согласился с транзакциями per-servlet. У вас должен быть сервисный уровень, который является частью приложения, которое знает об элементах работы. Контроллеры звонят в службы, которые обрабатывают транзакции.

+0

Я упомянул в вопросе, что приложение в настоящее время не находится в контейнере Spring и не может быть легко перенесено на него. Я бы с удовольствием использовал декларативные транзакции, если мог. – ColinD