2017-01-06 53 views
0

繼本主題PostgreSQL JDBC driver我正在尋找一個優雅的方式來利用的MyBatis內置的緩存功能對包含sql.ArrayResultSet正確的方式使用sql.Array的高速緩存中的MyBatis

MyBatis documentation摘錄:

讀寫的緩存會返回一個拷貝(通過序列)緩存對象。

由於MyBatis的只能它實現Serializable接口和既不sql.Array界面確實在我的具體情況擴展它也不PgArray確實實現它的高速緩存對象,MyBatis的拋出 org.apache.ibatis.cache.CacheException: Error serializing object. Cause: java.io.NotSerializableException查詢一個ResultSet含有array_agg() function一個array或結果時。

在這種情況下實現緩存的首選方式是什麼?

我可以使用javax.sql.rowset.serial.SerialArrayMyBatis ResultMap collection or association的組合嗎?

例如

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

回答

0

據我所知,結果集中的一列是SQL Array類型。 而你想要在會話中多次使用相同的參數執行相同的查詢,實際上是第一次碰到數據庫,然後碰到緩存。

Mybatis關聯用於將平坦結果行映射到對象結構。 Mybatis的收集目的是映射嵌套在對象中的多個結果行(例如:select parent and children)。 他們都不適合在這裏。 這裏是一個數組/元素的集合,但內聯在每一行的列中。

您不必擔心緩存SQL數組:您必須將其映射到結果類型並忘記它。

然後擴展org.apache.ibatis.type.BaseTypeHandler

@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數組,但是您可以在列表或建立任何你想要的結構。 <result column="arrayColumnName" property="destinationProperty" typeHandler="yourArrayTypeHandlerClass.fullQualifiedName" />

的SQL陣列不能序列化:這是一個資源:

參考類型處理器在resultMap的使用它取決於的ResultSet被關閉後,它取出,並根據PreparedStatement也關閉。

緩存的結果是映射的結果類型的對象的集合,它應該是可序列化的。