2017-12-20 4 views
0

私は、データベースからの値で更新されるページに複数のチャートを持っています。 チャートが初期化されたときにajaxコールを作成していますが、リクエストはコントローラクラスに送られるようになりました。 コントローラクラスからは、リポジトリクラスオブジェクトを使用してデータベースを複数呼び出しています。 複数のクエリを使用してデータベースに1回のリクエストを行い、応答の配列を取得するにはどうすればよいですか。スプリングブートを使用して並列にSQLクエリを実行するにはどうすればよいですか?

ここで私は、チャートの異なる3つの値を取得するために、3種類の呼び出しを行った:

Controller Class and Repository class

私は、単一の一つにこれらの要求を組み合わせることができますどのように。

JDBCでBatchingというコンセプトがあります。私は、私が望むことを行うためにaddBatchとexcuteBatchを使用できますが、Springバッチを使用して同じことを達成できるかどうかはわかりません。

答えて

0

これらを非同期クエリとして実装したいと思うように思えます。 これはSpring Data JPAのドキュメントでカバーされています。あなたは、現在のバージョンではこれらのメソッドのいずれかの形式を使用することができます。

@Async 
Future<User> findByFirstname(String firstname);    

@Async 
CompletableFuture<User> findOneByFirstname(String firstname); 

@Async 
ListenableFuture<User> findOneByLastname(String lastname); 

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-async

(あなたはまた、それぞれに別々のThreadのインスタンスをスピンオフこともできますが、私はそれをお勧めしません)

1

Statement.addBatchSELECTでは使用されていませんが、バッチ処理の場合はINSERTsとUPDATEs

必要なのはカスタムクエリwiですUNIONを使用して、必要なすべてのデータを1つのSQLで取得します。

 SELECT COUNT(n.lastUpdatedOn) 
     FROM TableEntity n 
     WHERE n.lastUpdatedOn BETWEEN :start1 AND :end1 
     UNION 
     SELECT COUNT(n.lastUpdatedOn) 
     FROM TableEntity n 
     WHERE n.lastUpdatedOn BETWEEN :start2 AND :end2 
     UNION 
     SELECT COUNT(n.lastUpdatedOn) 
     FROM TableEntity n 
     WHERE n.lastUpdatedOn BETWEEN :start3 AND :end3 

あなたのリポジトリコード。

@Query("SELECT COUNT(n.lastUpdatedOn) FROM TableEntity n WHERE n.lastUpdatedOn BETWEEN :start1 AND :end1 UNION SELECT COUNT(n.lastUpdatedOn) FROM TableEntity n WHERE n.lastUpdatedOn BETWEEN :start2 AND :end2 UNION SELECT COUNT(n.lastUpdatedOn) FROM TableEntity n WHERE n.lastUpdatedOn BETWEEN :start3 AND :end3") 
List<Long> countModifiedTimeStamp(@Param("start1") Timestamp start1, @Param("end1") Timestamp end1, @Param("start2") Timestamp start2, @Param("end2") Timestamp end2, @Param("start3") Timestamp start3, @Param("end3") Timestamp end3); 

そして、あなたは、返されたリストで

List<Long> counts = this.repo.countModifiedTimeStamp(todayStartDay, today, last7days, today, longBack, last7days); 

を呼び出すときは、第三に第二の最初の要素でtodaylast7dayslongBackを持つことになります。

関連する問題