2

現在はそうのようにスパナのためDatabaseClientを取得している:SpannerのDatabaseClientはスレッドセーフですか?

DatabaseClient dbClient = spanner.getDatabaseClient(...) 

は、複数のスレッド間でこのDatabaseClientオブジェクトを使用することが安全ですか?具体的には、DatabaseClientのインスタンスを依存関係に挿入し、スレッドセーフで再利用できるかどうか、または各スレッドがspannerを呼び出す必要があるかどうかを把握したいと考えていますか?

これはWeb APIサービスで使用されているため、URLへの着信要求が多く、着信要求ごとにスパナ接続が必要です。共有するのに最適なオブジェクトは何ですか?各セッションは、たとえばGoogle JSONの資格情報(SpannerOptions Builderで発生すると想定しています)にロードする必要はありません。

答えて

4

はい、スレッドセーフである必要があります。

DatabaseClientSessionPoolクラスを使用してimplementedです。スレッドセーフに関する注意事項は、SessionPoolimplementationに記載されています。

+1

おかげさまで、他の誰かを参照するために - > DatabaseClient/DatabaseClientImplは実際にDBへの接続プーリングを管理し調整するSessionPoolの周りの 'ダム'ラッパーです。したがって、DatabaseClientImplは効果的にシングルトンになります。 – user3707

+0

もう1つの質問 - アプリケーション全体でDatabaseClientを共有する場合、spanner.closeAsync()。get();したがって決して呼ばれることはありませんか? – user3707

+1

データベースあたりのセッション数に制限があります(https://cloud.google.com/spanner/docs/limitsを参照)。非アクティブなセッションは最終的にガベージコレクトされますが、アプリケーションの存続期間中はセッションプールを有効に保ち、それらのセッションが不要になったらクリーンアップすることをお勧めします。アプリのシャットダウン時に –

関連する問題