質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

2回答

7127閲覧

DBアクセスに失敗した場合、5回までリトライしたい

chihuahua_house

総合スコア23

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

1クリップ

投稿2019/06/13 08:03

SpringBootを使用しています。
DBアクセスに失敗した場合、リトライ処理を入れたいのですがどうもうまくいきません。
Connectionにはsql2Oを使用しています。

実装したい詳細な内容

DB接続時にsql2OExceptionの例外が返ってきた場合、5秒間待機してから5回までリトライする
リトライ回数が5回になったら終了する。

Java

1 public void dbacceser() { 2 try(Connection con = sql2o.open()){ 3 List <ProgressDataCollect> prodata = result.executeAndFetch(ProgressDataCollect.class); 4 5 int countarray[] = new int[3]; 6 7 /** 1レコードずつ処理開始 **/ 8 for (int i = 0; i < prodata.size(); i++) { 9 } 10 catch (Sql2oException e) { 11 this.logger.warn(e.getMessage()); 12 /**リトライ処理を入れたい */ 13 }

詳しい方、アドバイスお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

SpringBootをご利用でしたら、https://github.com/spring-projects/spring-retry を導入するのが一番簡単です
※Spring-RetryはAOPの機能を使うので、spring-boot-starter-aopも必要です。

java

1import org.springframework.beans.factory.annotation.Autowired; 2import org.springframework.retry.annotation.Backoff; 3import org.springframework.retry.annotation.Recover; 4import org.springframework.retry.annotation.Retryable; 5import org.springframework.stereotype.Repository; 6import org.springframework.transaction.annotation.Transactional; 7import org.sql2o.Connection; 8import org.sql2o.Sql2o; 9 10import lombok.extern.log4j.Log4j2; 11 12@Repository 13@Retryable 14public class SampleRepository { 15 16 @Autowired 17 Sql2o sql2o; 18 19 @Retryable(maxAttempts = 5, backoff=@Backoff(delay=5000), value = Exception.class) 20 @Transactional(readOnly = true) 21 public int findCount() { 22 String sql = "SELECT count(*) FROM sample1oo"; 23 24 try (Connection con = sql2o.open()) { 25 return con.createQuery(sql).executeScalar(Integer.class); 26 } 27 } 28 @Recover 29 public int recover() { 30 log.warn("-- failure"); 31 return -1; 32 } 33} 34

java

1import javax.sql.DataSource; 2 3import org.springframework.beans.factory.annotation.Autowired; 4import org.springframework.context.annotation.Bean; 5import org.springframework.context.annotation.Configuration; 6import org.springframework.jdbc.datasource.DataSourceTransactionManager; 7import org.springframework.retry.annotation.EnableRetry; 8import org.springframework.transaction.PlatformTransactionManager; 9import org.springframework.transaction.annotation.EnableTransactionManagement; 10import org.springframework.transaction.annotation.TransactionManagementConfigurer; 11import org.sql2o.Sql2o; 12 13@Configuration 14@EnableTransactionManagement 15@EnableRetry 16public class Sql2oConfig implements TransactionManagementConfigurer { 17 18 @Autowired 19 DataSource dataSource; 20 21 @Bean 22 public Sql2o sql2o() { 23 return new Sql2o(dataSource); 24 } 25 26 @Override 27 public PlatformTransactionManager annotationDrivenTransactionManager() { 28 return new DataSourceTransactionManager(dataSource); 29 } 30}

投稿2019/06/14 03:43

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

そのDBアクセスに係る処理を一つのメソッドにまとめてしまいます。
アクセスに成功したらTrue、失敗したらFalseを返すようにしておきます

次に、for文あたりで5回ループ処理を書いて、その関数を実行させ、返り値がTrueなら成功として終了、すべてFalseなら失敗として終了するような関数を組みましょう

投稿2019/06/13 11:12

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問