Доброго времени суток.
Есть приложение, в котором используется Spring + EclipseLink. Структура БД (postgresql) имеет особенность: в схеме public лежат пустые таблицы + есть куча схем в которых таблицы наследуются от public.*. Для работы с отдельными сущностями используется JPA, для работы со списками - JDBC. Для JPA и JDBC используется общий пул коннектов C3P0.
Сделал аннотацию @EmitentRequired для пометки метода как требующего переключения на конкретную схему. Есть аспект, который обрабатывает эту аннотацию. Бин аспекта, используя JPA, вызывает
entityManager.createNativeQuery("set search_path to ...").executeUpdate();
В бине, у которого область действия тоже «request» и который работает с JDBC, используется такой код:
@Autowired
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource, true);
}
@Transactional(readOnly=true)
@EmitentRequired
public ListPortion getAccountList(...) {
// Здесь идет код, который должен выполняться с уже установленной схемой
}
Проблему можно решить, обработав все переключения внутри методов, используя либо entityManager, либо jdbcTemplate в каждом конкретном случае, но хотелось бы чтобы переключение происходило автоматически.
Можно ли как-то настроить C3P0 в Spring Framework таким образом, чтобы при обработке запроса он всегда отдавал то же самое соединение?