Я начал изучать набор инструментов spring jdbc
. Прочтите некоторые документы о transactions в конце весны их шаблоны. Тем не менее некоторые общие вещи мне не понятны.Весна jdbc + PlatformTransactionManager + весна данных + теория
1) Если мы Spring Data
почему всегда слышал только о Spring JDBC
Spring Framework есть некоторые проект как Spring MVC
, Spring Security
и т.д.
Сначала я пытаюсь найти Spring JDBC
на домашнем сайте Весны, но не нашел его , Вместо того, чтобы я нашел Spring Data
проект. После некоторого исследования я нашел то, что Spring Data
использовал Spring JDBC
в JDBC Extensions
подпроекте, и последний имеет некоторые oracle
конкретные операции, что интересно для меня. И я понимаю, что не видел или не слышал ни пользы, либо видел ссылки в учебных пособиях до Spring Data
. Это действительно что-то плохое?
2) Должен ли я создать новый экземпляр JdbcTemplate каждый раз, когда
Следующая был JdbcTemplate
, полезный метод шаблона. Все документы изобилуют примерами кода, как
public class JdbcCorporateEventDao implements CorporateEventDao {
private JdbcTemplate jdbcTemplate;
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
// JDBC-backed implementations of the methods on the CorporateEventDao follow...
}
И они также пишут в документации
Экземпляры класса JdbcTemplate являются поточно после настройки
Это заблуждение. Почему в методе setDataSource
они создают новый экземпляр, если они могут поставить dataSource
в уже созданном или я его неправильно понял?
3) Как мы можем использовать TransactionTemplate
для написания сложных логики клиента?
TransactionTemplate
другой шаблон, который работает с TransactionStatus
. Насколько я понимаю, это может помочь мне управлять моей транзакцией , но сколько помощи? В начале execute
способ TransactionTemplate
есть transactionManager.getTransaction(this)
. В конце execute
метод у нас есть линия this.transactionManager.commit(status)
. Поэтому, как я понимаю, все, что я размещаю в методе doInTransaction
, будет выполняться в одной транзакции. Но как насчет выполнения других DAO
s с той же транзакцией в других методах? Он сдерживает работу с клиентом со сложной логикой. Я имею в виду, что вся логика должна быть в одном методе? Я думал, что это неправда.
Что я имею в виду, когда говорю сложную логику. Например, у меня есть собственный метод шаблона.
/*abstract class definition*/
public final void execute(){
onPreExec();
exec();
onPostExec();
}
abstract void exec(); //client execute few DAOs methods
public void onPreExec(){}
public void onPostExec(){} //commit or rollback transaction in another method
/*other class members*/
4) потокобезопасно использовать "PTM", "TD", "TS"?
Далее я начну исследовать, что стоит за this.transactionManager.commit(status)
. Это представляет мне PlatformTransactionManager
и TransactionDefinition
. Как я понимаю, в тот момент, когда я начинаю писать эту строку текста, эти классы могут помочь мне достичь моей цели в вопросе №3.Например, я могу сделать так:
/*abstract class definition*/
protected PlatformTransactionManager ptm;
protected TransactionDefinition td;
protected TransactionStatus ts;//TS with PROPAGATION_REQUIRED, ISOLATION_READ_COMMITTED
public final void execute(){
onPreExec();
exec();
onPostExec();
}
abstract void exec(); //client execute few DAOs methods
public void onPreExec(){//start transaction
ts=ptm.getTransaction(td);
}
public void onPostExec(){//end transaction
if (exec.wasCompletedSuccessfully()){
dao.markJobCompleted(); //do some for fix execution completeness
ptm.commit(ts);
} else {ptm.rollback(ts);}
}
/*other class members*/
По крайней мере, это выглядит более удобным, чем transactionTemplate.execute()
метод для некоторых случаев. Хотя он просто разделен на несколько частей transactionTemplate.execute()
.
Но все еще не ясный, это поточно-безопасный? то есть я могу использовать его и быть уверенным, что весь внутренний вызов JDBC
s callableStatment.execute()
методов от jdbcTemplate
будет ссылаться на это и только на эту транзакцию. И не вижу другую транзакцию в других потоках.
Спасибо за чтение.
Спасибо за ответ по одному вопросу – Mrusful