2013-03-07 5 views
-1

Я начал изучать набор инструментов 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 будет ссылаться на это и только на эту транзакцию. И не вижу другую транзакцию в других потоках.

Спасибо за чтение.

ответ

1

Что касается JdbcTemplate:

шаблон JDBC обеспечивается пружиной для взаимодействия с базой данных. вы можете использовать простой код JDBC для подключения базы данных и выполнения операций, но в этом случае вам придется обрабатывать проблемы, связанные с закрытием соединения и т. д. Spring jdbc template обрабатывает все эти проблемы, и конечный пользователь должен использовать эти операции api и execute.

относительно нового JDBCTemplate(), я думаю, что это пример, например, вам не нужно создавать объект шаблона jdbc в каждом классе. вы можете создать его, как источник данных, или создать для него класс BaseDAO.

+0

Спасибо за ответ по одному вопросу – Mrusful

0

только еще одна вещь, пожалуйста просмотрите Spring Data Support видео. это очень хорошие видео, чтобы изучить базовый шаблон JDBC.

0

Вам нужно понять, что весна существует уже 11 лет. Он развивается. Было много проектов, которые начались как вспомогательные к весне, которые были сфальсифицированы в нее. Весна JDBC была вокруг, так как Род Джонсон впервые написал ее. Spring Data - это недавняя разработка.

Смежные вопросы