Я собираюсь создать пример проекта, изучая Guice, который использует JDBC для чтения / записи в базу данных SQL. Однако, после многих лет использования Spring и отвлечения его от обработки соединений и транзакций, я изо всех сил пытаюсь сделать это концептуально.
Я хотел бы иметь службу, которая запускает и останавливает транзакцию и вызывает многочисленные репозитории, которые повторно используют одно и то же соединение и участвуют в одной транзакции. Мои вопросы:
- Где я могу создать свой источник данных?
- Как мне предоставить репозиториям доступ к соединению? (ThreadLocal?)
- Лучший способ управления транзакцией (Создание перехватчика для аннотации?)
Код ниже показывает, как я буду делать это весной. JdbcOperations, внедренный в каждый репозиторий, будет иметь доступ к соединению, связанному с активной транзакцией.
Мне не удалось найти много учебных пособий, которые покрывают это, кроме тех, которые показывают создание перехватчиков для транзакций.
Я рад, что продолжаю использовать Spring, поскольку он очень хорошо работает в моих проектах, но я хотел бы знать, как это сделать в чистом Guice и JBBC (без JPA / Hibernate / Warp / Reusing Spring)
@Service
public class MyService implements MyInterface {
@Autowired
private RepositoryA repositoryA;
@Autowired
private RepositoryB repositoryB;
@Autowired
private RepositoryC repositoryC;
@Override
@Transactional
public void doSomeWork() {
this.repositoryA.someInsert();
this.repositoryB.someUpdate();
this.repositoryC.someSelect();
}
}
@Repository
public class MyRepositoryA implements RepositoryA {
@Autowired
private JdbcOperations jdbcOperations;
@Override
public void someInsert() {
//use jdbcOperations to perform an insert
}
}
@Repository
public class MyRepositoryB implements RepositoryB {
@Autowired
private JdbcOperations jdbcOperations;
@Override
public void someUpdate() {
//use jdbcOperations to perform an update
}
}
@Repository
public class MyRepositoryC implements RepositoryC {
@Autowired
private JdbcOperations jdbcOperations;
@Override
public String someSelect() {
//use jdbcOperations to perform a select and use a RowMapper to produce results
return "select result";
}
}