2017-01-06 11 views
0

このトピックの後にPostgreSQL JDBC driversql.Arrayを含むResultSetのMyBatisビルドインキャッシュ機能を活用するための洗練された方法をお探しの場合は、 MyBatis documentationMyBatisでsql.Arrayのキャッシュを適切に使用する方法

抜粋:

読み書きキャッシュはキャッシュされたオブジェクトの(シリアライズ経由)のコピーを返します。

MyBatisののみSerializableインタフェースともsql.Arrayインタフェースを実装するキャッシュ・オブジェクトは、それを拡張したり、私の特定の場合にPgArrayないできるのでarray_agg() functionarray又は結果を含むResultSetを照会するときにそれを実装し、MyBatisのは org.apache.ibatis.cache.CacheException: Error serializing object. Cause: java.io.NotSerializableExceptionをスロー。

このシナリオでキャッシュを達成するための好ましい方法は何ですか?

MyBatis ResultMap collection or associationと組み合わせてjavax.sql.rowset.serial.SerialArrayを使用できますか?

<association property="values" column="myArrayColumn" javaType="ArrayList" jdbcType ="SerialArray"/> 

答えて

0

私の知る限り、結果セットの列はSQL配列型です。 そして、セッションで同じパラメータを複数回使用して同じクエリを実行したい場合は、最初にデータベースにヒットし、その後キャッシュにヒットします。

Mybatisの関連付けは、フラットな結果行をオブジェクト構造にマップするために使用されます。 Mybatisのコレクション目的は、オブジェクトにネストされた複数の結果行をマップすることです(例:select parentおよびchildren)。 ここではどちらもアプライアンスではありません。 これは要素の配列/コレクションですが、各行の列のインラインです。

SQL配列をキャッシュする必要はありません。結果の型にマップして忘れてしまいます。

@Override 
public final Object getNullableResult(final ResultSet resultSet, final String columnName) throws SQLException { 
    LOGGER.debug("getNullableResult - resultSet/columnName"); 
    final Array array = resultSet.getArray(columnName); 
    return array.getArray(); 
} 

@Override 
public final Object getNullableResult(final ResultSet resultSet, final int columnIndex) throws SQLException { 
    LOGGER.debug("getNullableResult - resultSet/columnIndex"); 
    final Array array = resultSet.getArray(columnIndex); 
    return array.getArray(); 
} 

ここで返された値は、基本的なJava配列ですが、リストによってはあなたが好きな構造を構築する:

はその後 org.apache.ibatis.type.BaseTypeHandlerを拡張します。

リファレンスこのresultMapで使用するタイプのハンドラ: <result column="arrayColumnName" property="destinationProperty" typeHandler="yourArrayTypeHandlerClass.fullQualifiedName" />

SQL配列はシリアライズすることはできません。これは、リソースである:それはフェッチとに応じて後にクローズされのResultSetに依存しますPreparedStatementも閉じます。

キャッシュされる結果は、結果の型のオブジェクトのコレクションであり、これは直列化可能です。

関連する問題