Я хочу создать образец проекта, изучая Guice, который использует JDBC для чтения/записи в базу данных SQL. Однако, после нескольких лет использования Spring и позволяя ему абстрагироваться от обработки соединений и транзакций, я изо всех сил стараюсь работать над этим.
Я хотел бы иметь службу, которая запускает и останавливает транзакцию, и вызывает множество репозиториев, которые повторно используют одно и то же соединение и участвуют в одной транзакции. Мои вопросы:
- Где я могу создать свой источник данных?
- Как предоставить репозиториям доступ к соединению? (ThreadLocal?)
- Лучший способ управления транзакцией (создание перехватчика для аннотации?)
В приведенном ниже коде показано, как я буду делать это в Spring. 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";
}
}