繁体   English   中英

在MyBatis中使用sql.Array缓存的正确方法

[英]Proper way to use caching of sql.Array in MyBatis

PostgreSQL JDBC驱动程序中遵循此主题之后,我正在寻找一种优雅的方法来为包含sql.Array的 ResultSet利用MyBatis内置缓存功能。

MyBatis文档摘录:

读写缓存将返回缓存对象的副本(通过序列化)。

由于MyBatis只能缓存实现了Serializable接口的对象,而sql.Array接口也没有扩展它,在我的特殊情况下PgArray都没有实现它,因此MyBatis抛出org.apache.ibatis.cache.CacheException: Error serializing object. Cause: java.io.NotSerializableException org.apache.ibatis.cache.CacheException: Error serializing object. Cause: java.io.NotSerializableException查询包含数组array_agg()函数结果的ResultSet时, org.apache.ibatis.cache.CacheException: Error serializing object. Cause: java.io.NotSerializableException

在这种情况下,实现缓存的首选方法是什么?

我可以将javax.sql.rowset.serial.SerialArrayMyBatis ResultMap集合或关联结合使用吗?

例如

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

据我了解,结果集中的一列是SQL Array类型。 您想在会话中多次执行具有相同参数的相同查询,实际上是第一次访问数据库,然后访问缓存。

Mybatis关联用于将平面结果行映射到对象结构。 Mybatis收集的目的是映射嵌套在对象中的多个结果行(例如:选择父级和子级)。 它们在这里都不适用。 这是元素的数组/集合,但在每一行的列中内联。

您一定不必费心缓存SQL Array:必须将其映射到结果类型并忘记它。

然后扩展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 Array,但是您可以使用List或构建所需的任何结构。

引用要在resultMap中使用的类型处理程序: <result column="arrayColumnName" property="destinationProperty" typeHandler="yourArrayTypeHandlerClass.fullQualifiedName" />

SQL Array不可序列化:这是一种资源:它依赖于获取后关闭的ResultSet以及关闭的PreparedStatement

缓存的结果是映射结果类型的对象的集合,该对象应可序列化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM