SlideShare una empresa de Scribd logo
1 de 62
Spring 概要 データアクセスとトランザクション処理 for Beginner 2012/2/27
前回までのお話 ,[object Object],[object Object],[object Object],プレゼン テーション ビジネス ロジック データベース アクセス RDB ブラウザ 表示の仕組み 永続化の仕組み 業務の仕組み DI x AOP Spring MVC
今日お話しする部分 ,[object Object],[object Object],プレゼン テーション ビジネス ロジック データベース アクセス RDB ブラウザ 表示の仕組み 永続化の仕組み 業務の仕組み DI x AOP Spring MVC ココの部分
データアクセス層の一般的な話と Spring
デーアクセス層の役割 ,[object Object],[object Object],[object Object],プレゼン テーション ビジネス ロジック データベース アクセス RDB ブラウザ 表示の仕組み 永続化の仕組み 業務の仕組み
データアクセスの処理が混在した業務ロジック (1/3) ,[object Object],[object Object],業務ロジック 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 public void transfer(Account from, Account to, int furikomigaku) { Connection con = null; PreparedStatement ps = null; ResultSet rs = null; try { con = dataSource.getConnection(); con.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); // 振込元の残高が足りてるか確認 int zandaka = -1; ps = con.prepareStatement( &quot;select zandaka from account where account_num=?&quot;); ps.setString(1, from.getAccountNumnber()); rs = ps.executeQuery(); if (rs.next() == true) { zandaka = rs.getInt(&quot;zandaka&quot;); } else { throw new BussinessException(&quot; データがありません &quot;); } int newZandaka = zandaka - furikomigaku; if (newZandaka < 0) { throw new BussinessException(&quot; 残高が足りません &quot;); } from.setZandaka(newZandaka);
データアクセスの処理が混在した業務ロジック (2/3) 業務ロジック 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 //  振込先の口座の残高を計算 ps.clearParameters(); ps.setString(1, to.getAccountNumnber()); rs = ps.executeQuery(); if (rs.next() == true) { zandaka = rs.getInt(&quot;zandaka&quot;); } else { throw new BussinessException(&quot; データがありません &quot;); }  newZandaka = zandaka + furikomigaku; to.setZandaka(newZandaka); //  振込元の残高を更新 ps = con.prepareStatement( &quot;update account set zandaka=? where account_num=?&quot;); ps.setInt(1, from.getZandaka()); ps.setString(2, from.getAccountNumnber()); ps.execute(); //  振込先の残高を更新 ps.clearParameters(); ps.setInt(1, to.getZandaka()); ps.setString(2, to.getAccountNumnber()); ps.execute(); con.commit();
データアクセスの処理が混在した業務ロジック (3/3) 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 } catch (SQLException sqle) { try { con.rollback(); } catch (Exception e) { System.out.println(&quot; システムエラー &quot;+e); } int errorCode = sqle.getErrorCode(); if (errorCode == ERR_DEADLOCK) { throw new BussinessException(&quot; デッドロック発生 &quot;, sqle); } else { throw new SystemException(&quot; システムエラー &quot;, sqle); } } finally { try { con.close(); } catch (Exception e) { System.out.println(&quot; システムエラー &quot;+e); } } }
データアクセスの処理を分離させた業務ロジック ,[object Object],・データアクセス専用の部品 ・業務ロジックを含まない ・ DAO (Data Access Object) と呼ばれる 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public void transfer(Account from, Account to, int furikomigaku) { //  振込元の残高を確認 int zandaka =  accountDao.getZandaka(from.getAccountNumnber()); int newZandaka = zandaka - furikomigaku; if (newZandaka < 0) { throw new BussinessException(&quot; 残高が足りません &quot;); } from.setZandaka(newZandaka); //  振込先の口座の残高を計算 zandaka =  accountDao.getZandaka(to.getAccountNumnber()); newZandaka = zandaka + furikomigaku; to.setZandaka(newZandaka); //  振込元の残高を更新 accountDao.updateZandaka(from); //  振込先の残高を更新 accountDao.updateZandaka(to); } AccountDao + getZandaka(accountNumber:String):int + updateZandaka(account:Account):void
DAO パターンとは? ,[object Object],[object Object],[object Object],[object Object],データ ベース アクセス ビジネス ロジック 使う AccountDao BankDao UserDao など CRUD が一通り 揃っている インターフェースを 用意 挿入メソッド 取得メソッド 更新メソッド 削除メソッド XXXDao
データアクセス技術のいろいろ ,[object Object],[object Object],データ ベース JDBC Hibernate iBATIS(mybatis) JPA JDO 自社フレームワーク ・ ・ S2Dao 挿入メソッド 取得メソッド 更新メソッド 削除メソッド XXXDao
データアクセスの Spring の機能 ,[object Object],データ ベース Spring JDBC JDBC Hibernate 連携 Hibernate JPA 連携 JPA iBATIS 連携 iBATIS(2.x) JDO 連携 JDO 挿入メソッド 取得メソッド 更新メソッド 削除メソッド XXXDao
Spring のデータアクセスの機能を使う利点 ,[object Object],[object Object],[object Object]
Spring JDBC
JDBC の問題 (1/3) ,[object Object],JDBC データ ベース + getZandaka(accountNumber:String):int + updateZandaka(account:Account):void AccountDao
JDBC の問題 (2/3) ,[object Object],・コード量が多い   Connection 、 PreparedStatement ・・  リソースの取得・解放が面倒 解放漏れの危険も getZandaka メソッド 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 public int getZandaka(String accountNumber) { Connection con = null; PreparedStatement ps = null; ResultSet rs = null; try { con = dataSource.getConnection(); int zandaka = -1; ps = con.prepareStatement(&quot;select zandaka from account where account_num=?&quot;); ps.setString(1, accountNumber); rs = ps.executeQuery(); if (rs.next() == true) { zandaka = rs.getInt(&quot;zandaka&quot;); } else { throw new BussinessException(&quot; データがありません &quot;); } return zandaka; } catch (SQLException sqle) { throw new SystemException(&quot; システムエラー &quot;, sqle); } finally { try { con.close(); } catch (Exception e) { System.out.println(&quot; システムエラー &quot;+e); } } }
JDBC の問題 (3/3) ・例外 SQLException の解釈が必要  原因を特定するためのエラーコードが    DB 製品毎に異なる updateZandaka メソッド 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 public void updateZandaka(Account account) { Connection con = null; PreparedStatement ps = null; ResultSet rs = null; try { con = dataSource.getConnection(); con.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); ps = con.prepareStatement(&quot;update account set zandaka=? where account_num=?&quot;); ps.setInt(1, account.getZandaka()); ps.setString(2, account.getAccountNumnber()); ps.execute(); con.commit(); } catch (SQLException sqle) { try { con.rollback(); } catch (Exception e) { System.out.println(&quot; システムエラー &quot; + e); } int errorCode = sqle.getErrorCode(); if (errorCode == ERR_DEADLOCK) { throw new BussinessException(&quot; デッドロック発生 &quot;, sqle); } else { throw new SystemException(&quot; システムエラー &quot;, sqle); } } finally { try { con.close(); } catch (Exception e) { System.out.println(&quot; システムエラー &quot; + e); } } }
Spring JDBC による解決 ,[object Object],[object Object],[object Object],[object Object],[object Object],Spring JDBC JDBC データ ベース 挿入メソッド 取得メソッド 更新メソッド 削除メソッド XXXDao
Template クラスを使ってコードをシンプルに ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Template クラスの使い方 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Template クラスの Bean の準備 ・・・ <bean class=&quot;org.springframework.jdbc.core.JdbcTemplate&quot;> <property name=&quot;dataSource&quot; ref=&quot;dataSource&quot; /> </bean> <bean class=&quot;org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate&quot;> <property name=&quot;dataSource&quot; ref=&quot;dataSource&quot; /> </bean> <bean id=&quot;dataSource&quot; class=&quot;com.mchange.v2.c3p0.ComboPooledDataSource&quot;> <property name=&quot;driverClass&quot; value=&quot;oracle.jdbc.driver.OracleDriver&quot;/> <property name=&quot;jdbcUrl&quot; value=&quot;jdbc:oracle:thin:@localhost:1521:sample&quot;/> <property name=&quot;user&quot; value=&quot;spring3&quot;/> <property name=&quot;password&quot; value=&quot;spring3&quot;/> </bean> ・・・ ・・・ @Repository public class AccountDaoSpringJdbc implements AccountDao { @Autowired private JdbcTemplate jdbcTemplate; @Autowired private NamedParameterJdbcTemplate npJdbcTemplate; ・・・
クエリ ~エンティティクラスへ変換しない場合 (1/2) ,[object Object],[object Object],[object Object],int count = jdbcTemplate.queryForInt( &quot;select count(*) from pet&quot; ); int count = jdbcTemplate.queryForInt( &quot;select count(*) from pet where owner_name=?“  , ownerName); ・・・ public int getZandaka(String accountNumber) { int zandaka = jdbcTemplate.queryForInt( &quot;select zandaka from account where account_num=?&quot; , accountNumber); return zandaka; } ・・・ 【 AccountDao の getZandaka メソッドの場合】
クエリ ~エンティティクラスへ変換しない場合 (2/2) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],String petName = jdbcTemplate.queryForObject( &quot;select pet_name from pet where pet_id=?&quot; , String.class, id); Date birthDate = jdbcTemplate.queryForObject( &quot;select birth_date from pet where pet_id=?&quot; , Date.class, id); Map<String, Object> pet = jdbcTemplate.queryForMap( &quot;select * from pet where pet_id=?&quot; , id); String petName = (String)pet.get(&quot;pet_name&quot;); List<Map<String, Object>> petList = jdbcTemplate.queryForList( &quot;select * from pet where owner_name=?&quot; , ownerName);
クエリ ~エンティティクラスへ変換する場合 (1/2 ) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],※ 匿名クラス ※ 匿名クラス:「その場限り」のサブクラスもしくは実装クラス。名前が無い
≪ 補足≫匿名クラスを使わない書き方 class MyRowMapper implements RowMapper<Pet> { public Pet mapRow(ResultSet rs, int rowNum) throws SQLException { Pet p = new Pet(); p.setPetId(rs.getInt(&quot;pet_id&quot;)); p.setPetName(rs.getString(&quot;pet_name&quot;)); p.setOwnerName(rs.getString(&quot;owner_name&quot;)); return p; } } Pet pet = jdbcTemplate.queryForObject( &quot;select * from pet where pet_id=?&quot; ,new MyRowMapper() ,id);
RowMapper とシーケンス図
クエリ ~エンティティクラスへ変換する場合 (2/2) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
インサート・アップデート・デリート ,[object Object],[object Object],[object Object],[object Object],jdbcTemplate.update( &quot;insert into pet (pet_id, pet_name, owner_name) values (?, ?, ?)&quot; , pet.getPetId(), pet.getPetName(), pet.getOwnerName()); jdbcTemplate.update( &quot;update pet set pet_name=?, owner_name=? where pet_id=?&quot; , pet.getPetName(), pet.getOwnerName(), pet.getPetId()); jdbcTemplate.update( &quot;delete from pet where pet_id=?“ , pet.getPetId());
NamedParameterJdbcTemplate を使った場合 ,[object Object],[object Object],npJdbcTemplate.update( &quot;insert into pet (pet_id, pet_name, owner_name)&quot; + &quot; values (:pet_id, :pet_name, :owner_name)&quot; ,new MapSqlParameterSource() .addValue(&quot;pet_id&quot;, pet.getPetId()) .addValue(&quot;pet_name&quot;, pet.getPetName()) .addValue(&quot;owner_name&quot;, pet.getOwnerName()) ); ※ メソッドチェーン:複数のメソッド呼び出しを1センテンスで記述するテクニック ※ メソッドチェーン
≪ 補足≫メソッドチェーンを使わないやり方 MapSqlParameterSource map = new MapSqlParameterSource(); map.addValue(&quot;pet_id&quot;, pet.getPetId()); map.addValue(&quot;pet_name&quot;, pet.getPetName()); map.addValue(&quot;owner_name&quot;, pet.getOwnerName()); npJdbcTemplate.update( &quot;insert into pet (pet_id, pet_name, owner_name)&quot; + &quot; values (:pet_id, :pet_name, :owner_name)&quot; ,map );
バッチアップデート ,[object Object],List<Object[]> args = new ArrayList<Object[]>(); for (Pet pet : petList) { args.add(new Object[]{pet.getOwnerName(), pet.getPetId()}); } int[] num = jdbcTemplate.batchUpdate( &quot;update pet set owner_name=? where pet_id=?“ , args);
プロシージャコール ,[object Object],[object Object],[object Object],[object Object],SimpleJdbcCall call = new SimpleJdbcCall(jdbcTemplate.getDataSource()); call.withProcedureName( &quot;calc_pet_price&quot; ); MapSqlParameterSource args = new MapSqlParameterSource() .addValue(&quot;pet_id&quot;, petId); Map<String, Object> out = call.execute(args); int price = (Integer)out.get(&quot;price&quot;);
汎用データアクセス例外で SQLException の解釈を不要に ,[object Object],[object Object],[object Object],[object Object],・・・ } catch (SQLException sqle) { int errorCode = sqle.getErrorCode(); if (errorCode == ERR_DATAINTEGRITY) { throw new DataIntegrityException(&quot; 整合性違反エラー発生 &quot;, sqle); } else if (errorCode == ERR_PERMISSION) { throw new DataPermissionException(“ 権限が不正 &quot;, sqle); } else if (errorCode ==  ・・・ ・・・
Spring の汎用データアクセス例外 ,[object Object],[object Object],[object Object],[object Object],【例外クラスの例 ( 全部で 20 個以上存在する ) 】 CannotAcquireLockException ロックの取得に失敗 ConcurrencyFailureException 同時実行時のエラー DataIntegrityViolationException 整合性違反エラー DeadlockLoserDataAccessException デッドロックが発生 EmptyResultDataAccessException 取得しようとしたデータが存在しない IncorrectResultSizeDataAccessException 取得したレコードの数が不正 OptimisticLockingFailureException 楽観的ロックに失敗 PermissionDeniedDataAccessException 権限エラー
汎用データアクセス例外のハンドリングの方針 ,[object Object],[object Object],[object Object],プレゼン テーション ビジネス ロジック データベース アクセス RDB ブラウザ サービス DAO コントローラ 共 通 対応可能な例外のみ catch 対応可能な例外のみ catch 対処できない例外は一元的に処理
データソース ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
データソースの使い方 ,[object Object],[object Object],・・・ <bean id=&quot;dataSource&quot; > ・・・ </bean> ・・・ ・・・ <bean id=“foo&quot; > <property name=&quot;dataSource&quot; ref=&quot;dataSource&quot; /> </bean> ・・・ ・・・ @Autowired private DataSource dataSource; ・・・
Spring が提供する DataSource ,[object Object],[object Object],[object Object],[object Object],注意) テスト用途で用意されたものなので本番で使用するものではない <bean id=&quot;dataSource&quot; class=&quot;org.springframework.jdbc.datasource.DriverManagerDataSource&quot;> <property name=&quot;driverClassName&quot; value=&quot;org.postgresql.Driver&quot; /> <property name=&quot;url&quot; value=&quot;jdbc:postgresql://localhost/samaple&quot; /> <property name=&quot;username&quot; value=&quot;spring3&quot; /> <property name=&quot;password&quot; value=&quot;spring3&quot; /> </bean> 【 DriverManagerDataSource の 設定の例 】
サードパーティ が提供する DataSource ,[object Object],[object Object],[object Object],[object Object],<bean id=&quot;dataSource&quot; class=&quot;com.mchange.v2.c3p0.ComboPooledDataSource&quot; destroy-method=&quot;close&quot;> <property name=&quot;driverClass&quot; value=&quot;org.postgresql.Driver&quot; /> <property name=&quot;jdbcUrl&quot; value=&quot;jdbc:postgresql://localhost/sample&quot; /> <property name=&quot;user&quot; value=&quot;spring3&quot; /> <property name=&quot;password&quot; value=&quot;spring3&quot; /> <property name=&quot;maxPoolSize&quot; value=&quot;20&quot;/> </bean> 【 c3p0 の 設定の例 】
AP サーバ が提供する DataSource ,[object Object],[object Object],[object Object],[object Object],<bean id=&quot;dataSource&quot; class=&quot;org.springframework.jndi.JndiObjectFactoryBean&quot;> <property name=&quot;jndiName&quot; value=&quot;jdbc/MyDataSource&quot;/> </bean> <jee:jndi-lookup id=&quot;dataSource&quot;  jndi-name=&quot;jdbc/MyDataSource&quot; /> <bean class=&quot;org.springframework.context.annotation.CommonAnnotationBeanPostProcessor&quot;> <property name=&quot;alwaysUseJndiLookup&quot; value=&quot;true&quot;/> </bean> @Resource(name=“jdbc/MyDataSource”) private DataSource dataSource; Common Anotations(JSR250) 用の 設定が必要
トランザクション機能
トランザクションとは? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],ACID 意味 解説 Atomic トランザクションの原子性 トランザクション内の全ての処理は、全ておこなわれたか、もしくは何もおこなわれなかったかのどちらかだけであること。 Consistent  データの一貫性 データに一貫性があること。一貫性を守ってない例:親テーブルがないのに子テーブルがある。 Isolated  トランザクションの独立性 平行して走るトランザクションが互いに独立していること。 Durable データの永続性 データが永続化されていること。永続化されているデータが読み出せること。
Web アプリのトランザクション処理 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
トランザクションの境界 ,[object Object],[object Object],[object Object],[object Object],[object Object],プレゼン テーション ビジネス ロジック データベース アクセス RDB ブラウザ サービス DAO コントローラ トランザクションの開始 トランザクションの終了
実装する場所の問題 ,[object Object],[object Object],[object Object],[object Object],[object Object],:ビジネスロジック : AccountDao transfer updateZandaka( 振込元 ) updateZandaka( 振込先 )
問題 ,[object Object],[object Object],[object Object]
AOP を使用したトランザクション処理 ,[object Object],クライアント トランザクション 処理 サービス DAO RDB トランザクションの開始 トランザクションのコミット サービスの Proxy
トランザクションマネージャ ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
トランザクション定義情報 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
伝搬属性 ,[object Object],サービス2 サービス1 DAO 1 DAO 2 コントローラ2 コントローラ1 ① ② 伝搬 属性 サービス1に対して設定を行ったとき ① の場合 ② の場合 PROPAGATION_REQUIRED トランザクションを開始 サービス2のトランザクションを利用 PROPAGATION_REQUIRES_NEW トランザクションを開始 新しいトランザクションを開始 PROPAGATION_SUPPORTS トランザクションを行わない サービス2のトランザクションを利用 PROPAGATION_MANDATORY 例外を投げる サービス2のトランザクションを利用 PROPAGATION_NESTED トランザクションを開始 部分的なトランザクションを開始 (save ポイント ) PROPAGATION_NEVER トランザクションを行わない 例外を投げる PROPAGATION_NOT_SUPPORTED トランザクションを行わない トランザクションを行わない
独立性レベル ,[object Object],トランザクション1 トランザクション2 独立性レベル 解説 ISOLATION_READ_COMMITTED 他のトランザクションが変更したがまだコミットしていないデータは読み出せない。 ISOLATION_READ_UNCOMMITTED 他のトランザクションが変更したがまだコミットしていないデータを読み出せる。 ISORATION_REPEATABLE_READ トランザクション内で複数回データを読み込んだ場合、他のトランザクションが途中でデータを変更しても同じ値が読み込まれる ISORATION_SERIALIZABLE トランザクションを完全に独立させる ISOLATION_DEFAULT データベースが提供するデフォルトの独立性レベルを利用する。
データが矛盾した状態と独立性レベル ,[object Object],[object Object],○ :許す  × :許さない Dirty Read 他のトランザクションが変更したがまだコミットしていないデータを読み出してしまう Unrepeatable Read トランザクションの中で同じデータを複数回読み出す際、他のトランザクションが当該データを変更すると、以前に読み出したときと違ったデータを読み出してしまう。 Phantom Read トランザクションの中で同じデータを複数回読み出す際、他のトランザクションが新しくレコードを追加すると、以前に読み出したときに無かったレコードを読み出してしまう。 独立性レベル Dirty Read Unrepeatable Read Phantom Read ISOLATION_READ_UNCOMMITTED ○ ○ ○ ISOLATION_READ_COMMITTED × ○ ○ ISORATION_REPEATABLE_READ × × ○ ISORATION_SERIALIZABLE × × ×
その他のトランザクション定義情報 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
トランザクションマネージャの実装 ≪ Interface≫ PlatformTransactionManager DataSourceTransactionManager HibernateTransactionManager JtaTransactionManager JpaTransactionManager JdoTransactionManager データアクセス技術に合わせて 適切なトランザクションマネージャを 選択する
トランザクションマネージャの登録 ,[object Object],・・・ <bean id=&quot;transactionManager&quot; class=&quot;org.springframework.jdbc.datasource.DataSourceTransactionManager&quot;> <property name=&quot;dataSource&quot; ref=&quot;dataSource&quot; /> </bean> ・・・ DataSourceTransactionManager の例
2種類の使い方 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
宣言的トランザクションの設定 (Bean 定義ファイル ) ,[object Object],[object Object],<aop:config> <aop:advisor advice-ref=&quot;transactionAdvice&quot; pointcut=&quot;execution(* *..*Service.*(..))&quot; /> </aop:config> <tx:advice id=&quot;transactionAdvice&quot; transaction-manager=&quot;transactionManager&quot;> <tx:attributes> <tx:method name=&quot;get*&quot; read-only=&quot;true&quot; /> <tx:method name=&quot;update*&quot;  propagation=&quot;REQUIRED&quot;  isolation=&quot;READ_COMMITTED&quot; timeout=&quot;10&quot;  read-only=&quot;false&quot; rollback-for=“SystemException&quot; /> </tx:attributes> </tx:advice>
宣言的トランザクションの設定 ( アノテーション ) ,[object Object],[object Object],@Transactional( propagation=Propagation.REQUIRED,  isolation=Isolation.READ_COMMITTED,  timeout=10,  readOnly=false,  rollbackForClassName=&quot;BusinessException&quot; ) public void updatePet(Pet pet) throws BusinessException { ・・・省略 }
明示的トランザクションの使い方 ,[object Object],@Autowired private PlatformTransactionManager txManager; public void transfer(Account from, Account to, int furikomigaku) { DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED); def.setTimeout(10); def.setReadOnly(false); TransactionStatus status = txManager.getTransaction(def); try { //  業務ロジック・・・ } catch (RuntimeException e) { txManager.rollback(status); throw e; } txManager.commit(status); }
明示的トランザクションの利用シーンの例 ,[object Object],[object Object],:クライアント : Proxy :サービス updatePet updatePet トランザクション開始 トランザクション終了 「○」 Proxy を介すためトランザクション処理が行われる 「 × 」 Proxy を介さないためトランザクション処理が行われない updateInternal
ご清聴ありがとうございました
ライセンスについて ,[object Object],[object Object],[object Object]

Más contenido relacionado

La actualidad más candente

PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)Koichiro Matsuoka
 
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)今こそ知りたいSpring Web(Spring Fest 2020講演資料)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)NTT DATA Technology & Innovation
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)NTT DATA Technology & Innovation
 
AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05
AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05
AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05都元ダイスケ Miyamoto
 
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャーssuser070fa9
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知るShuhei Fujita
 
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
Apache Airflow入門  (マーケティングデータ分析基盤技術勉強会)Apache Airflow入門  (マーケティングデータ分析基盤技術勉強会)
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)Takeshi Mikami
 
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~NTT DATA OSS Professional Services
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編infinite_loop
 
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
AngularとSpring Bootで作るSPA + RESTful Web ServiceアプリケーションAngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーションssuser070fa9
 
Springを何となく使ってる人が抑えるべきポイント
Springを何となく使ってる人が抑えるべきポイントSpringを何となく使ってる人が抑えるべきポイント
Springを何となく使ってる人が抑えるべきポイント土岐 孝平
 
バッチは地味だが役に立つ
バッチは地味だが役に立つバッチは地味だが役に立つ
バッチは地味だが役に立つapkiban
 
SPAのルーティングの話
SPAのルーティングの話SPAのルーティングの話
SPAのルーティングの話ushiboy
 
ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本kazuki kumagai
 
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理NTT DATA Technology & Innovation
 
Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)
Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)
Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)NTT DATA Technology & Innovation
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところY Watanabe
 

La actualidad más candente (20)

PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
 
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)今こそ知りたいSpring Web(Spring Fest 2020講演資料)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
 
AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05
AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05
AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05
 
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
 
Docker Tokyo
Docker TokyoDocker Tokyo
Docker Tokyo
 
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知る
 
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
Apache Airflow入門  (マーケティングデータ分析基盤技術勉強会)Apache Airflow入門  (マーケティングデータ分析基盤技術勉強会)
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
 
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編
 
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
AngularとSpring Bootで作るSPA + RESTful Web ServiceアプリケーションAngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
 
Springを何となく使ってる人が抑えるべきポイント
Springを何となく使ってる人が抑えるべきポイントSpringを何となく使ってる人が抑えるべきポイント
Springを何となく使ってる人が抑えるべきポイント
 
バッチは地味だが役に立つ
バッチは地味だが役に立つバッチは地味だが役に立つ
バッチは地味だが役に立つ
 
SPAのルーティングの話
SPAのルーティングの話SPAのルーティングの話
SPAのルーティングの話
 
ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本
 
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
 
Metaspace
MetaspaceMetaspace
Metaspace
 
Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)
Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)
Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
 

Destacado

Spring3.1概要 AOP & MVC
Spring3.1概要 AOP & MVCSpring3.1概要 AOP & MVC
Spring3.1概要 AOP & MVCYuichi Hasegawa
 
Sevletとjsp
SevletとjspSevletとjsp
Sevletとjspmikansan
 
Javaの基本 基本データ型編
Javaの基本 基本データ型編Javaの基本 基本データ型編
Javaの基本 基本データ型編mikansan
 
システムアーキテクト~My batis編~
システムアーキテクト~My batis編~システムアーキテクト~My batis編~
システムアーキテクト~My batis編~Shinichi Kozake
 
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐO/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐkwatch
 
SXSW 2016 takeaways
SXSW 2016 takeawaysSXSW 2016 takeaways
SXSW 2016 takeawaysHavas
 

Destacado (7)

Spring3.1概要 AOP & MVC
Spring3.1概要 AOP & MVCSpring3.1概要 AOP & MVC
Spring3.1概要 AOP & MVC
 
Spring3.1概要x di
Spring3.1概要x diSpring3.1概要x di
Spring3.1概要x di
 
Sevletとjsp
SevletとjspSevletとjsp
Sevletとjsp
 
Javaの基本 基本データ型編
Javaの基本 基本データ型編Javaの基本 基本データ型編
Javaの基本 基本データ型編
 
システムアーキテクト~My batis編~
システムアーキテクト~My batis編~システムアーキテクト~My batis編~
システムアーキテクト~My batis編~
 
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐO/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐ
 
SXSW 2016 takeaways
SXSW 2016 takeawaysSXSW 2016 takeaways
SXSW 2016 takeaways
 

Similar a Spring3.1概要 データアクセスとトランザクション処理

データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回Naoyuki Yamada
 
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...Shotaro Suzuki
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platformToru Yamaguchi
 
Develop Web Application with Node.js + Express
Develop Web Application with Node.js + ExpressDevelop Web Application with Node.js + Express
Develop Web Application with Node.js + ExpressAkinari Tsugo
 
PowerShellを使用したWindows Serverの管理
PowerShellを使用したWindows Serverの管理PowerShellを使用したWindows Serverの管理
PowerShellを使用したWindows Serverの管理junichi anno
 
リアルFacebookガジェットを作った(ロングバージョン)
リアルFacebookガジェットを作った(ロングバージョン)リアルFacebookガジェットを作った(ロングバージョン)
リアルFacebookガジェットを作った(ロングバージョン)Mariko Goda
 
[db tech showcase Tokyo 2017] D15: ビッグデータ x 機械学習の高速分析をVerticaで実現!by ヒューレット・パッ...
[db tech showcase Tokyo 2017] D15: ビッグデータ x 機械学習の高速分析をVerticaで実現!by ヒューレット・パッ...[db tech showcase Tokyo 2017] D15: ビッグデータ x 機械学習の高速分析をVerticaで実現!by ヒューレット・パッ...
[db tech showcase Tokyo 2017] D15: ビッグデータ x 機械学習の高速分析をVerticaで実現!by ヒューレット・パッ...Insight Technology, Inc.
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについてtako pons
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略takezoe
 
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016
仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016Takayuki Shimizukawa
 
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Yoshifumi Kawai
 
Spark Analytics - スケーラブルな分散処理
Spark Analytics - スケーラブルな分散処理Spark Analytics - スケーラブルな分散処理
Spark Analytics - スケーラブルな分散処理Tusyoshi Matsuzaki
 
DB Tech showcase Tokyo 2015 Works Applications
DB Tech showcase Tokyo 2015 Works ApplicationsDB Tech showcase Tokyo 2015 Works Applications
DB Tech showcase Tokyo 2015 Works Applications2t3
 
WebRTC getStats - WebRTC Meetup Tokyo 5 LT
WebRTC getStats - WebRTC Meetup Tokyo 5 LTWebRTC getStats - WebRTC Meetup Tokyo 5 LT
WebRTC getStats - WebRTC Meetup Tokyo 5 LTmganeko
 
Tech Ed 2010 Japan T1-310 Microsoft Online Services 展開時の実践テクニック
Tech Ed 2010 Japan T1-310 Microsoft Online Services 展開時の実践テクニックTech Ed 2010 Japan T1-310 Microsoft Online Services 展開時の実践テクニック
Tech Ed 2010 Japan T1-310 Microsoft Online Services 展開時の実践テクニックkumo2010
 
[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送
[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送
[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送Google Cloud Platform - Japan
 
AppExchangeパートナー&デベロッパー第2部:20070523版
AppExchangeパートナー&デベロッパー第2部:20070523版AppExchangeパートナー&デベロッパー第2部:20070523版
AppExchangeパートナー&デベロッパー第2部:20070523版Junichiro Tasaki
 
EC-CUBEプラグイン講義
EC-CUBEプラグイン講義EC-CUBEプラグイン講義
EC-CUBEプラグイン講義ria1201
 
zozotown real time linkage infrastructure
zozotown real time linkage infrastructurezozotown real time linkage infrastructure
zozotown real time linkage infrastructureKeisukeTaniguchi2
 
クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術Koichi Fujikawa
 

Similar a Spring3.1概要 データアクセスとトランザクション処理 (20)

データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
 
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
 
Develop Web Application with Node.js + Express
Develop Web Application with Node.js + ExpressDevelop Web Application with Node.js + Express
Develop Web Application with Node.js + Express
 
PowerShellを使用したWindows Serverの管理
PowerShellを使用したWindows Serverの管理PowerShellを使用したWindows Serverの管理
PowerShellを使用したWindows Serverの管理
 
リアルFacebookガジェットを作った(ロングバージョン)
リアルFacebookガジェットを作った(ロングバージョン)リアルFacebookガジェットを作った(ロングバージョン)
リアルFacebookガジェットを作った(ロングバージョン)
 
[db tech showcase Tokyo 2017] D15: ビッグデータ x 機械学習の高速分析をVerticaで実現!by ヒューレット・パッ...
[db tech showcase Tokyo 2017] D15: ビッグデータ x 機械学習の高速分析をVerticaで実現!by ヒューレット・パッ...[db tech showcase Tokyo 2017] D15: ビッグデータ x 機械学習の高速分析をVerticaで実現!by ヒューレット・パッ...
[db tech showcase Tokyo 2017] D15: ビッグデータ x 機械学習の高速分析をVerticaで実現!by ヒューレット・パッ...
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについて
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略
 
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016
仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016
 
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
 
Spark Analytics - スケーラブルな分散処理
Spark Analytics - スケーラブルな分散処理Spark Analytics - スケーラブルな分散処理
Spark Analytics - スケーラブルな分散処理
 
DB Tech showcase Tokyo 2015 Works Applications
DB Tech showcase Tokyo 2015 Works ApplicationsDB Tech showcase Tokyo 2015 Works Applications
DB Tech showcase Tokyo 2015 Works Applications
 
WebRTC getStats - WebRTC Meetup Tokyo 5 LT
WebRTC getStats - WebRTC Meetup Tokyo 5 LTWebRTC getStats - WebRTC Meetup Tokyo 5 LT
WebRTC getStats - WebRTC Meetup Tokyo 5 LT
 
Tech Ed 2010 Japan T1-310 Microsoft Online Services 展開時の実践テクニック
Tech Ed 2010 Japan T1-310 Microsoft Online Services 展開時の実践テクニックTech Ed 2010 Japan T1-310 Microsoft Online Services 展開時の実践テクニック
Tech Ed 2010 Japan T1-310 Microsoft Online Services 展開時の実践テクニック
 
[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送
[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送
[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送
 
AppExchangeパートナー&デベロッパー第2部:20070523版
AppExchangeパートナー&デベロッパー第2部:20070523版AppExchangeパートナー&デベロッパー第2部:20070523版
AppExchangeパートナー&デベロッパー第2部:20070523版
 
EC-CUBEプラグイン講義
EC-CUBEプラグイン講義EC-CUBEプラグイン講義
EC-CUBEプラグイン講義
 
zozotown real time linkage infrastructure
zozotown real time linkage infrastructurezozotown real time linkage infrastructure
zozotown real time linkage infrastructure
 
クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術
 

Más de 土岐 孝平

What's new in Spring Boot 2.6 ?
What's new in Spring Boot 2.6 ?What's new in Spring Boot 2.6 ?
What's new in Spring Boot 2.6 ?土岐 孝平
 
SpringベースのCloud Native Application
SpringベースのCloud Native ApplicationSpringベースのCloud Native Application
SpringベースのCloud Native Application土岐 孝平
 
Spring fest2020 spring-security
Spring fest2020 spring-securitySpring fest2020 spring-security
Spring fest2020 spring-security土岐 孝平
 
Microserviceの今どきのインフラを探る
Microserviceの今どきのインフラを探るMicroserviceの今どきのインフラを探る
Microserviceの今どきのインフラを探る土岐 孝平
 
OpenID Connect入門
OpenID Connect入門OpenID Connect入門
OpenID Connect入門土岐 孝平
 
入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き土岐 孝平
 
これから始めるSpringのwebアプリケーション
これから始めるSpringのwebアプリケーションこれから始めるSpringのwebアプリケーション
これから始めるSpringのwebアプリケーション土岐 孝平
 
今さら聞けないDiとspring
今さら聞けないDiとspring今さら聞けないDiとspring
今さら聞けないDiとspring土岐 孝平
 
Springを使ったwebアプリにリファクタリングしよう
Springを使ったwebアプリにリファクタリングしようSpringを使ったwebアプリにリファクタリングしよう
Springを使ったwebアプリにリファクタリングしよう土岐 孝平
 
業務システムとマイクロサービス
業務システムとマイクロサービス業務システムとマイクロサービス
業務システムとマイクロサービス土岐 孝平
 
エッセンシャルCore springハンズオン
エッセンシャルCore springハンズオンエッセンシャルCore springハンズオン
エッセンシャルCore springハンズオン土岐 孝平
 
試験にでるSpring
試験にでるSpring試験にでるSpring
試験にでるSpring土岐 孝平
 

Más de 土岐 孝平 (13)

What's new in Spring Boot 2.6 ?
What's new in Spring Boot 2.6 ?What's new in Spring Boot 2.6 ?
What's new in Spring Boot 2.6 ?
 
SpringベースのCloud Native Application
SpringベースのCloud Native ApplicationSpringベースのCloud Native Application
SpringベースのCloud Native Application
 
Spring fest2020 spring-security
Spring fest2020 spring-securitySpring fest2020 spring-security
Spring fest2020 spring-security
 
Microserviceの今どきのインフラを探る
Microserviceの今どきのインフラを探るMicroserviceの今どきのインフラを探る
Microserviceの今どきのインフラを探る
 
OpenID Connect入門
OpenID Connect入門OpenID Connect入門
OpenID Connect入門
 
入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き
 
これから始めるSpringのwebアプリケーション
これから始めるSpringのwebアプリケーションこれから始めるSpringのwebアプリケーション
これから始めるSpringのwebアプリケーション
 
今さら聞けないDiとspring
今さら聞けないDiとspring今さら聞けないDiとspring
今さら聞けないDiとspring
 
Springを使ったwebアプリにリファクタリングしよう
Springを使ったwebアプリにリファクタリングしようSpringを使ったwebアプリにリファクタリングしよう
Springを使ったwebアプリにリファクタリングしよう
 
業務システムとマイクロサービス
業務システムとマイクロサービス業務システムとマイクロサービス
業務システムとマイクロサービス
 
エッセンシャルCore springハンズオン
エッセンシャルCore springハンズオンエッセンシャルCore springハンズオン
エッセンシャルCore springハンズオン
 
試験にでるSpring
試験にでるSpring試験にでるSpring
試験にでるSpring
 
vFabricを触ろう
vFabricを触ろうvFabricを触ろう
vFabricを触ろう
 

Último

TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 

Último (9)

TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 

Spring3.1概要 データアクセスとトランザクション処理

  • 2.
  • 3.
  • 5.
  • 6.
  • 7. データアクセスの処理が混在した業務ロジック (2/3) 業務ロジック 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 // 振込先の口座の残高を計算 ps.clearParameters(); ps.setString(1, to.getAccountNumnber()); rs = ps.executeQuery(); if (rs.next() == true) { zandaka = rs.getInt(&quot;zandaka&quot;); } else { throw new BussinessException(&quot; データがありません &quot;); } newZandaka = zandaka + furikomigaku; to.setZandaka(newZandaka); //  振込元の残高を更新 ps = con.prepareStatement( &quot;update account set zandaka=? where account_num=?&quot;); ps.setInt(1, from.getZandaka()); ps.setString(2, from.getAccountNumnber()); ps.execute(); // 振込先の残高を更新 ps.clearParameters(); ps.setInt(1, to.getZandaka()); ps.setString(2, to.getAccountNumnber()); ps.execute(); con.commit();
  • 8. データアクセスの処理が混在した業務ロジック (3/3) 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 } catch (SQLException sqle) { try { con.rollback(); } catch (Exception e) { System.out.println(&quot; システムエラー &quot;+e); } int errorCode = sqle.getErrorCode(); if (errorCode == ERR_DEADLOCK) { throw new BussinessException(&quot; デッドロック発生 &quot;, sqle); } else { throw new SystemException(&quot; システムエラー &quot;, sqle); } } finally { try { con.close(); } catch (Exception e) { System.out.println(&quot; システムエラー &quot;+e); } } }
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 15.
  • 16.
  • 17. JDBC の問題 (3/3) ・例外 SQLException の解釈が必要  原因を特定するためのエラーコードが    DB 製品毎に異なる updateZandaka メソッド 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 public void updateZandaka(Account account) { Connection con = null; PreparedStatement ps = null; ResultSet rs = null; try { con = dataSource.getConnection(); con.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); ps = con.prepareStatement(&quot;update account set zandaka=? where account_num=?&quot;); ps.setInt(1, account.getZandaka()); ps.setString(2, account.getAccountNumnber()); ps.execute(); con.commit(); } catch (SQLException sqle) { try { con.rollback(); } catch (Exception e) { System.out.println(&quot; システムエラー &quot; + e); } int errorCode = sqle.getErrorCode(); if (errorCode == ERR_DEADLOCK) { throw new BussinessException(&quot; デッドロック発生 &quot;, sqle); } else { throw new SystemException(&quot; システムエラー &quot;, sqle); } } finally { try { con.close(); } catch (Exception e) { System.out.println(&quot; システムエラー &quot; + e); } } }
  • 18.
  • 19.
  • 20.
  • 21. Template クラスの Bean の準備 ・・・ <bean class=&quot;org.springframework.jdbc.core.JdbcTemplate&quot;> <property name=&quot;dataSource&quot; ref=&quot;dataSource&quot; /> </bean> <bean class=&quot;org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate&quot;> <property name=&quot;dataSource&quot; ref=&quot;dataSource&quot; /> </bean> <bean id=&quot;dataSource&quot; class=&quot;com.mchange.v2.c3p0.ComboPooledDataSource&quot;> <property name=&quot;driverClass&quot; value=&quot;oracle.jdbc.driver.OracleDriver&quot;/> <property name=&quot;jdbcUrl&quot; value=&quot;jdbc:oracle:thin:@localhost:1521:sample&quot;/> <property name=&quot;user&quot; value=&quot;spring3&quot;/> <property name=&quot;password&quot; value=&quot;spring3&quot;/> </bean> ・・・ ・・・ @Repository public class AccountDaoSpringJdbc implements AccountDao { @Autowired private JdbcTemplate jdbcTemplate; @Autowired private NamedParameterJdbcTemplate npJdbcTemplate; ・・・
  • 22.
  • 23.
  • 24.
  • 25. ≪ 補足≫匿名クラスを使わない書き方 class MyRowMapper implements RowMapper<Pet> { public Pet mapRow(ResultSet rs, int rowNum) throws SQLException { Pet p = new Pet(); p.setPetId(rs.getInt(&quot;pet_id&quot;)); p.setPetName(rs.getString(&quot;pet_name&quot;)); p.setOwnerName(rs.getString(&quot;owner_name&quot;)); return p; } } Pet pet = jdbcTemplate.queryForObject( &quot;select * from pet where pet_id=?&quot; ,new MyRowMapper() ,id);
  • 27.
  • 28.
  • 29.
  • 30. ≪ 補足≫メソッドチェーンを使わないやり方 MapSqlParameterSource map = new MapSqlParameterSource(); map.addValue(&quot;pet_id&quot;, pet.getPetId()); map.addValue(&quot;pet_name&quot;, pet.getPetName()); map.addValue(&quot;owner_name&quot;, pet.getOwnerName()); npJdbcTemplate.update( &quot;insert into pet (pet_id, pet_name, owner_name)&quot; + &quot; values (:pet_id, :pet_name, :owner_name)&quot; ,map );
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54. トランザクションマネージャの実装 ≪ Interface≫ PlatformTransactionManager DataSourceTransactionManager HibernateTransactionManager JtaTransactionManager JpaTransactionManager JdoTransactionManager データアクセス技術に合わせて 適切なトランザクションマネージャを 選択する
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 62.

Notas del editor

  1. というところで、時間も迫ってまいりましたので、 これで、発表を終わります。 ご清聴ありがとうございました。