[英]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.SerialArray与MyBatis 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.