Spring Data Couchbaseのエンティティ検証、オプティミスティックロック、およびクエリ一貫性
1. 前書き
introduction to Spring Data Couchbaseの後、この2番目のチュートリアルでは、エンティティ検証(JSR-303)、楽観的ロック、およびCouchbaseドキュメントデータベースのさまざまなレベルのクエリ整合性のサポートに焦点を当てます。
2. エンティティの検証
Spring Data Couchbaseは、JSR-303エンティティ検証アノテーションのサポートを提供します。 この機能を利用するために、最初にMSRプロジェクトの依存関係セクションにJSR-303ライブラリを追加します。
javax.validation
validation-api
1.1.0.Final
次に、JSR-303の実装を追加します。 Hibernate実装を使用します。
org.hibernate
hibernate-validator
5.2.4.Final
最後に、バリデーターのファクトリーBeanと対応するCouchbaseイベントリスナーをCouchbase構成に追加します。
@Bean
public LocalValidatorFactoryBean localValidatorFactoryBean() {
return new LocalValidatorFactoryBean();
}
@Bean
public ValidatingCouchbaseEventListener validatingCouchbaseEventListener() {
return new ValidatingCouchbaseEventListener(localValidatorFactoryBean());
}
同等のXML構成は次のようになります。
次に、JSR-303アノテーションをエンティティクラスに追加します。 永続化操作中に制約違反が発生すると、操作は失敗し、ConstraintViolationExceptionがスローされます。
Studentエンティティに関連して適用できる制約のサンプルを次に示します。
@Field
@NotNull
@Size(min=1, max=20)
@Pattern(regexp="^[a-zA-Z .'-]+$")
private String firstName;
...
@Field
@Past
private DateTime dateOfBirth;
3. 楽観的ロック
Spring Data Couchbaseは、Spring Data JPA(@Transactionalアノテーションを介して)などの他のSpring Dataモジュールで実現できるものと同様のマルチドキュメントトランザクションをサポートしていません。また、ロールバック機能も提供していません。
ただし、@Versionアノテーションを使用することで、他のSpringDataモジュールとほぼ同じ方法で楽観的ロックをサポートします。
@Version
private long version;
内部では、Couchbaseは「比較とスワップ」(CAS)メカニズムとして知られているものを使用して、データストアレベルで楽観的なロックを実現します。
Couchbaseの各ドキュメントには、ドキュメントのメタデータまたはコンテンツが変更されるたびに自動的に変更されるCAS値が関連付けられています。 フィールドで@Version注釈を使用すると、ドキュメントがCouchbaseから取得されるたびに、そのフィールドに現在のCAS値が入力されます。
ドキュメントをCouchbaseに保存しようとすると、このフィールドはCouchbaseの現在のCAS値と照合されます。 値が一致しない場合、永続化操作はOptimisticLockingExceptionで失敗します。
コード内のこのフィールドにアクセスしたり変更したりしないように注意するのはextremely importantです。
4. クエリの一貫性
Couchbaseに永続化レイヤーを実装する場合、古い読み取りおよび書き込みの可能性を考慮する必要があります。 これは、ドキュメントが挿入、更新、または削除されるときに、これらの変更を反映するためにバッキングビューとインデックスが更新されるまでに時間がかかる場合があるためです。
また、Couchbaseノードのクラスターに支えられた大規模なデータセットがある場合、これは特にOLTPシステムにとって重大な問題になる可能性があります。
Spring Dataは、一部のリポジトリおよびテンプレート操作に堅牢なレベルの一貫性を提供し、さらに、アプリケーションで許容される読み取りおよび書き込みの一貫性のレベルを決定できるいくつかのオプションを提供します。
4.1. 一貫性のレベル
Spring Dataを使用すると、org.springframework.data.couchbase.core.queryパッケージにあるConsistency列挙型を介して、アプリケーションのさまざまなレベルのクエリの一貫性と失効性を指定できます。
この列挙は、次のレベルのクエリの一貫性と陳腐化を、最低から最高まで定義します。
-
EVENTUALLY_CONSISTENT
-
古い読み取りが許可されます
-
Couchbase標準アルゴリズムに従ってインデックスが更新されます
-
-
UPDATE_AFTER
-
古い読み取りが許可されます
-
インデックスは各リクエスト後に更新されます
-
-
DEFAULT_CONSISTENCY(READ_YOUR_OWN_WRITESと同じ)
-
READ_YOUR_OWN_WRITES
-
古い読み取りは許可されていません
-
インデックスは各リクエスト後に更新されます
-
-
STRONGLY_CONSISTENT
-
古い読み取りは許可されていません
-
インデックスは各ステートメントの後に更新されます
-
4.2. デフォルトの動作
Couchbaseから削除されたドキュメントがあり、バッキングビューとインデックスが完全に更新されていない場合を考えてください。
CouchbaseRepositoryの組み込みメソッドdeleteAll()は、バッキングビューによって検出されたが、削除がビューにまだ反映されていないドキュメントを安全に無視します。
同様に、CouchbaseTemplateの組み込みメソッドfindByViewとfindBySpatialViewは、バッキングビューによって最初に検出されたが、その後削除されたドキュメントを返さないことにより、同様のレベルの一貫性を提供します。
この記事の執筆時点での公式のSpringData Couchbase 2.1.xドキュメントによると、他のすべてのテンプレートメソッド、組み込みリポジトリメソッド、および派生リポジトリクエリメソッドについて、Spring Dataはデフォルトの整合性レベルConsistency.READ_YOUR_OWN_WRITES.を使用します
以前のバージョンのライブラリではデフォルトのConsistency.UPDATE_AFTERが使用されていたことは注目に値します。
使用しているバージョンにかかわらず、提供されているデフォルトの一貫性レベルを盲目的に受け入れることについて予約がある場合、Springでは、以下のサブセクションで説明するように、使用する一貫性レベルを宣言的に制御できる2つの方法を提供します
4.3. グローバル整合性設定
Couchbaseリポジトリを使用していて、アプリケーションがより高いレベルの整合性を必要とする場合、またはより弱いレベルを許容できる場合は、Couchbase構成のgetDefaultConsistency()メソッドをオーバーライドすることにより、すべてのリポジトリのデフォルトの整合性設定をオーバーライドできます。 。
Couchbase構成クラスでグローバル整合性レベルをオーバーライドする方法は次のとおりです。
@Override
public Consistency getDefaultConsistency() {
return Consistency.STRONGLY_CONSISTENT;
}
同等のXML設定を次に示します。
厳密なレベルの一貫性の代価はクエリ時のレイテンシーの増加であることに注意してください。したがって、アプリケーションのニーズに基づいてこの設定を調整してください。
たとえば、データがバッチでのみ追加または更新されることが多いデータウェアハウスまたはレポートアプリケーションは、EVENTUALLY_CONSISTENTの候補として適していますが、OLTPアプリケーションは、READ_YOUR_OWN_WRITESなどのより厳密なレベルに向かう傾向があります。 )sまたはSTRONGLY_CONSISTENT。
4.4. カスタム整合性の実装
より細かく調整された整合性設定が必要な場合は、整合性レベルを個別に制御するクエリに独自のリポジトリ実装を提供し、queryViewを使用することで、クエリごとにデフォルトの整合性レベルを上書きできます。 sおよび/またはCouchbaseTemplateによって提供されるqueryN1QLメソッド。
古い読み取りを許可したくないStudentエンティティに対してfindByFirstNameStartsWithというカスタムリポジトリメソッドを実装しましょう。
最初に、カスタムメソッド宣言を含むインターフェイスを作成します。
public interface CustomStudentRepository {
List findByFirstNameStartsWith(String s);
}
次に、インターフェイスを実装し、基盤となるCouchbase Java SDKのStale設定を目的のレベルに設定します。
public class CustomStudentRepositoryImpl implements CustomStudentRepository {
@Autowired
private CouchbaseTemplate template;
public List findByFirstNameStartsWith(String s) {
return template.findByView(ViewQuery.from("student", "byFirstName")
.startKey(s)
.stale(Stale.FALSE),
Student.class);
}
}
最後に、標準リポジトリインターフェイスで汎用CrudRepositoryインターフェイスとカスタムリポジトリインターフェイスの両方を拡張することにより、クライアントは、標準リポジトリインターフェイスのすべての組み込みメソッドと派生メソッドに加えて、で実装したカスタムメソッドにアクセスできます。カスタムリポジトリクラス:
public interface StudentRepository extends CrudRepository,
CustomStudentRepository {
...
}
5. 結論
このチュートリアルでは、Spring Data Couchbaseコミュニティプロジェクトを使用するときにJSR-303エンティティ検証を実装し、楽観的なロック機能を実現する方法を示しました。
また、Couchbaseでクエリの一貫性を理解する必要性についても議論し、Spring Data Couchbaseが提供するさまざまなレベルの一貫性を紹介しました。
最後に、Spring Data Couchbaseでグローバルに使用されるデフォルトの一貫性レベルといくつかの特定の方法について説明し、グローバルなデフォルトの一貫性設定をオーバーライドする方法と、クエリごとに一貫性設定をオーバーライドする方法を示しました独自のカスタムリポジトリ実装。
このチュートリアルの完全なソースコードは、the GitHub projectで表示できます。
Spring Data Couchbaseの詳細については、公式のSpring Data Couchbaseプロジェクトサイトにアクセスしてください。