---
schema_version: "1"
id: 86ec63121199206ad786bd49808c4a92875e3e9034ee188ab28a3288d4209e74
title: オブジェクトストリーミング (ページネーション)
collection: mulesoft
version: current
locale: ja-jp
portal_url: https://docs.salesforce.com/mulesoft/current/ja-jp/mule-sdk/1.1/object-streaming.md
canonical_url: https://docs.mulesoft.com/jp/mule-sdk/1.1/object-streaming
source_site: docs.mulesoft.com
content_type: documentation
content_hash: 671fc98c641851ffa897959a3c2bb91c9374e142ce576f4c0ac1f60ce48be29f
description: MuleSoft Documentation Site
release: "1.1"
latest: false
---
# オブジェクトストリーミング (ページネーション)

オブジェクトストリーミングは、未加工のバイトストリームではなく Java オブジェクトをストリーミングするという点を除いては​[バイナリストリーミング](https://docs.mulesoft.com/jp/mule-sdk/1.1/binary-streaming)​と同じです。

Devkit (Mule 3) に精通しているなら、自動ページネーション機能の進化形と考えればわかりやすいでしょう。Devkit との違いは、Mule SDK では反復可能アクセス、ランダムアクセス、同時アクセスをサポートしているという点です。

データベースコネクタの Select 操作を大幅に簡素化したオブジェクトストリーミングの使用例を示します。

```java
public PagingProvider<DbConnection, Map<String, Object>> list(@Text String sql) { (1)
    return new PagingProvider<DbConnection, Map<String, Object>>() {

      private ResultSet resultSet;

      @Override
      public List<Map<String, Object>> getPage(DbConnection connection) { (2)
        if (resultSet == null) {
            resultSet = executeQuery(connection, sql); (3)
        }

        return extractPageFrom(resultSet);
      }

      @Override
      public java.util.Optional<Integer> getTotalResults(DbConnection connection) {
        return java.util.Optional.empty(); (4)
      }

      @Override
      public void close(DbConnection connection) throws MuleException {
        resultSet.close(); (5)
      }
    }
}
```

<table>
<tbody><tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>このメソッドの署名について 2 点注意すべきことがあります。
<div class="ulist">
<ul>
<li>
<p>メソッドは ​<code>PagingDelegate</code>​ オブジェクトを返します。​<code>PagingDelegate</code>​ は 2 つの汎用型を必要とします。1 つ目はデリゲート関数が次ページ以降を取得するために使用する接続の種別で、2 つ目はページ内の要素の種別です。</p>
</li>
<li>
<p>List 操作はパラメーターを受け取ります。ただし、接続オブジェクトは受け取りません。ページングされた操作は接続を受け取ることができないためです。代わりに、Runtime によって ​<code>PagingProvider</code>​ に渡される接続を常に使用する必要があります。</p>
<div class="paragraph">
<p>そのため、この署名は ​<code>DbConnection</code>​ オブジェクトを使用したページのクエリ結果を返し、ストリームの各項目は結果の各行を表す ​<code>Map&lt;String, Object&gt;</code>​ となります。</p>
</div>
</li>
</ul>
</div></td>
</tr>
<tr>
<td><i class="conum" data-value="2"></i><b>2</b></td>
<td><code>getPage()</code>​ は次のページをフェッチして返します。このメソッドは、ページをフェッチするために使用する接続を受け取ります。ストリームが終わったら、このメソッドは次を行う必要があります。</td>
</tr>
<tr>
<td><i class="conum" data-value="3"></i><b>3</b></td>
<td>操作のロジックによって、最初のページを取得するロジックか、次のページを取得するロジックが必要な場合があります。</td>
</tr>
<tr>
<td><i class="conum" data-value="4"></i><b>4</b></td>
<td>オブジェクトストリーミングの別の機能として、ストリーム内の実際のオブジェクト数を通知することができます。これには ​<code>getTotalResults()</code>​ メソッドを実装する必要があります。ただし、すべての API がこのメソッドをサポートしているわけではありません。たとえば、​<em>Salesforce</em>​API はこのメソッドをサポートしていますが JDBC (データベースコネクタを駆動する API) はサポートしていません。そのため、このメソッドは Java ​<code>Optional</code>​ クラス (この場合は空のクラス) を返します。ページネーション操作のユーザーは、​<code>#[payload.size]</code>​ のような式によってこの値を取得できます。</td>
</tr>
<tr>
<td><i class="conum" data-value="5"></i><b>5</b></td>
<td>最後に、ストリーム内のオブジェクトが無くなったら ​<code>close()</code>​ メソッドが呼び出されます。このメソッドは接続を終了するものでは​​<strong>ありません</strong>​。接続の終了は SDK が自動的に行います。このメソッドは、このページングデリゲート関数が持っている可能性のあるリソースを解放するものです。たとえば、このケースでは、ページングデリゲート関数は、各ページ値を抽出する元となる ​<code>ResultSet</code>​ を持っています。この ​<code>ResultSet</code>​ を解放する必要があります。</td>
</tr>
</tbody></table>

## [](#スティッキー接続)スティッキー接続

デフォルトでは、​`getPage()`​ が受け取る接続が呼び出しごとに同じであるという保証はありません。それで別に問題はありません。ほとんどの API (特に Rest API) では、​_問題ではない_​だけではなく、機能の 1 つでもあります。ただし、他のケース (データベースなど) では、​**同じ**​​接続を使用して、すべてのページを取得する​​**必要があります**​。これは Devkit では不可能でした。

Mule SDK ではスティッキー接続が追加されており、​`getPage()`​ メソッドが常に同じトランザクションで呼び出されるように Runtime で保証しなければならないことを指示します。次に例を示します。

```java
public PagingProvider<DbConnection, Map<String, Object>> list(String sql) {
    return new PagingProvider<DbConnection, Map<String, Object>>() {

      private ResultSet resultSet;

      @Override
      public List<Map<String, Object>> getPage(DbConnection connection) {
        ...
      }

      @Override
      public java.util.Optional<Integer> getTotalResults(DbConnection connection) {
        ...
      }

      @Override
      public void close(DbConnection connection) throws MuleException {
        ...
      }

      @Override
      public boolean useStickyConnections() {
        return true;
      }
    }
}
```

## [](#ストリーミングの設定)ストリーミングの設定

バイナリストリーミングと同様に、自動ページング操作は ​`<repeatable-in-memory-iterable />`​、​`<ee:repeatable-file-store-iterable />`​、および ​`<non-repeatable-iterable />`​ を介してストリーミング設定を自動的に取得します。これらの要素の詳細については、​[バイナリストリーミング](https://docs.mulesoft.com/jp/mule-sdk/1.1/binary-streaming)​についての説明を参照してください。上記の Select 操作の例でカスタムファイルストアストリーミングを設定すると次のようになります。

```xml
<db:select sql="select * from REALLY_LARGE_TABLE">
    <ee:repeatable-file-store-iterable inMemoryObjects="100"/>
</db:select>
```