データ]

  • リンク:/tag/couchbase/[Couchbase]


1前書き

/spring-data-couchbase[Spring Data Couchbaseの紹介]の後、この2番目のチュートリアルでは、エンティティ検証(JSR-303)、楽観的ロック、およびCouchbaseドキュメントデータベースのさまざまなレベルのクエリの一貫性のサポートに焦点を当てます。


2エンティティ検証

Spring Data CouchbaseはJSR-303エンティティ検証アノテーションのサポートを提供します。この機能を利用するには、まずMavenプロジェクトの依存関係セクションにJSR-303ライブラリを追加します。

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.1.0.Final</version>
</dependency>

それからJSR-303の実装を追加します。 Hibernateの実装を使います。

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.2.4.Final</version>
</dependency>

最後に、バリデータファクトリBeanと対応するCouchbaseイベントリスナをCouchbaseの設定に追加します。

@Bean
public LocalValidatorFactoryBean localValidatorFactoryBean() {
    return new LocalValidatorFactoryBean();
}

@Bean
public ValidatingCouchbaseEventListener validatingCouchbaseEventListener() {
    return new ValidatingCouchbaseEventListener(localValidatorFactoryBean());
}

同等のXML構成は次のようになります。

<bean id="validator"
  class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>

<bean id="validatingEventListener"
  class="org.springframework.data.couchbase.core.mapping.event.ValidatingCouchbaseEventListener"/>

今度は私達のエンティティクラスに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などの他のSpring Dataモジュールで(

@ Transactional

アノテーションを介して)実現できるものと同様のマルチドキュメントトランザクションをサポートしません。また、ロールバック機能も提供しません。

ただし、

@ Version

アノテーションを使用することで、他のSpring Dataモジュールとほぼ同じ方法で楽観的ロックをサポートします。

@Version
private long version;

カバーの下で、Couchbaseはデータストアレベルで楽観的なロックを達成するために「比較と交換」(CAS)メカニズムとして知られているものを使います。

Couchbaseの各ドキュメントには、ドキュメントのメタデータまたはコンテンツが変更されたときに自動的に変更されるCAS値が関連付けられています。

フィールドに

@ Version

アノテーションを使用すると、ドキュメントがCouchbaseから取得されるたびにそのフィールドに現在のCAS値が入力されます。

ドキュメントをCouchbaseに保存しようとすると、このフィールドはCouchbaseの現在のCAS値に対してチェックされます。値が一致しない場合、永続化操作は

OptimisticLockingException

で失敗します。

コード内でこのフィールドにアクセスしたり変更したりしないでください。


4クエリの一貫性

Couchbaseの上に永続層を実装するとき、あなたは古い読み書きの可能性を考慮しなければなりません。これは、ドキュメントが挿入、更新、または削除されたときに、これらの変更を反映するためにバッキングビューおよびインデックスが更新されるまでに時間がかかることがあるためです。

そして、Couchbaseノードのクラスタでバックアップされた大規模なデータセットがある場合、これは特にOLTPシステムにとって重大な問題になる可能性があります。

Spring Dataは、いくつかのリポジトリとテンプレート操作に対して堅牢なレベルの一貫性を提供し、さらにあなたのアプリケーションにとって許容できる読み込みと書き込みの一貫性のレベルを決定するためのいくつかのオプションを提供します。


4.1. 一貫性のレベル

Spring Dataでは、

org.springframework.data.couchbase.core.query

パッケージに含まれる

Consistency

enumを使用して、さまざまなレベルのクエリの一貫性と失効性をアプリケーションに指定できます。

この列挙型は、最低から最高まで、次のレベルのクエリの一貫性と古さを定義します。


  • 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

は、バッキングビューによって最初に見つかったがその後削除されたドキュメントを返さないことによって、同じレベルの一貫性を提供します。

このドキュメントの執筆時点での公式のSpring Data Couchbase 2.1.xドキュメントによると、他のすべてのテンプレートメソッド、組み込みリポジトリメソッド、および派生リポジトリクエリメソッドについて、Spring Dataはデフォルトの一貫性レベル

Consistency.READ

YOUR

OWN

WRITES.__を使用します。

以前のバージョンのライブラリではデフォルトの

Consistency.UPDATE

AFTER__が使用されていたことは注目に値します。

どちらのバージョンを使用していても、提供されているデフォルトの整合性レベルを盲目的に受け入れることについて予約がある場合は、次のサブセクションで説明するように、使用する整合性レベルを宣言的に制御できる方法が2つあります。


4.3. グローバル整合性設定

Couchbaseリポジトリを使用していて、アプリケーションがより高いレベルの一貫性を要求する場合、またはそれより弱いレベルを許容できる場合は、Couchbase設定の

getDefaultConsistency()

メソッドをオーバーライドすることによってすべてのリポジトリのデフォルトの一貫性設定をオーバーライドできます。

Couchbase設定クラスでグローバルな一貫性レベルをオーバーライドする方法は次のとおりです。

@Override
public Consistency getDefaultConsistency() {
    return Consistency.STRONGLY__CONSISTENT;
}

これは同等のXML構成です。

<couchbase:template consistency="STRONGLY__CONSISTENT"/>

より厳密なレベルの一貫性は、クエリ時の待ち時間が長くなるため、アプリケーションのニーズに基づいてこの設定を調整するようにしてください。

たとえば、データがバッチでのみ追加または更新されることが多いデータウェアハウスまたはレポート作成アプリケーションは

EVENTUALLY

CONSISTENT

に適していますが、OLTPアプリケーションはおそらく

READ

YOUR

OWN

WRITES



STRONGLY

CONSISTENT__などのより厳密なレベルに向けるべきです。


4.4. カスタム整合性の実装

より細かく調整された一貫性設定が必要な場合は、一貫性レベルを個別に制御したいクエリに対して独自のリポジトリ実装を提供し、

queryView

および/またはを使用することで、クエリごとにデフォルトの一貫性レベルを上書きできます

CouchbaseTemplate

によって提供される

queryN1QL

メソッド。

古い読み取りを許可したくない

Student

エンティティに

findByFirstNameStartsWith

というカスタムリポジトリメソッドを実装しましょう。

まず、カスタムメソッド宣言を含むインタフェースを作成します。

public interface CustomStudentRepository {
    List<Student> findByFirstNameStartsWith(String s);
}

次に、インターフェースを実装し、基になるCouchbase Java SDKの

Stale

設定を目的のレベルに設定します。

public class CustomStudentRepositoryImpl implements CustomStudentRepository {

    @Autowired
    private CouchbaseTemplate template;

    public List<Student> findByFirstNameStartsWith(String s) {
        return template.findByView(ViewQuery.from("student", "byFirstName")
          .startKey(s)
          .stale(Stale.FALSE),
          Student.class);
    }
}

最後に、標準リポジトリインタフェースに汎用の

CrudRepository

インタフェースとカスタムリポジトリインタフェースの両方を拡張させることで、クライアントは標準リポジトリインタフェースのすべての組み込みメソッドと派生メソッド、およびカスタムリポジトリクラスに実装されたカスタムメソッドにアクセスできます。 :

public interface StudentRepository extends CrudRepository<Student, String>,
  CustomStudentRepository {
    ...
}


5結論

このチュートリアルでは、Spring Data Couchbaseコミュニティプロジェクトを使用するときにJSR-303エンティティ検証を実装し、楽観的ロック機能を実現する方法を示しました。

また、Couchbaseでクエリの一貫性を理解する必要性についても議論し、Spring Data Couchbaseによって提供されるさまざまなレベルの一貫性を紹介しました。

最後に、Spring Data Couchbaseがグローバルに使用するデフォルトの整合性レベルといくつかの特定のメソッドについて説明し、グローバルなデフォルトの整合性設定をオーバーライドする方法とクエリーごとに一貫性設定をオーバーライドする方法を示します。独自のカスタムリポジトリ実装

このチュートリアルの完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/spring-data-couchbase-2[GitHubプロジェクト]で見ることができます。

Spring Data Couchbaseの詳細については、公式のhttp://projects.spring.io/spring-data-couchbase/[Spring Data Couchbase]プロジェクトサイトを参照してください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です