JDBCTemplate的一个坑

最近给数据平台的模型查询部分加了一个查询缓存。通过Spring AOP实现,思路是将查询结果通过gson序列化后存储在HBase中。

List<Map<String,Object>> query(String sql)

对Service的逻辑完全无修改。

在功能准备上线的时候发现某个漏斗查询第一次查询结果正常,后面的查询(走的是缓存)会报一个空指针异常。

于是在出问题的代码上设断点调试。发现语句中的大写字段名在查询结果中被转成了小写。还是很奇怪,那第一次查询

的时候为什么不会跑出空指针异常呢?


仔细对比两次运行结果,发现Spring的JdbcTemplate返回的是LinkedCaseInsensitiveMap,而Gson反序列化产生的Map是一个LinkedTreeMap。

前者的key是大小写不敏感的而后者是大小写敏感的,于是出现两次运行结果的不同。

总结:在面向接口编程时数据的实际类型比较容易被忽视,在调试代码的过程中既要关注数据的内容,也要关注数据的实际类型。另外数据库的字段和字段别名通常是大小写不敏感的,在程序设计时字段不应该包含大小写信息。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,234评论 19 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,997评论 6 342
  • 1、引言 数据库设计过程中表、字段等的命名规范也算是设计规范的一部分,不过设计规范更多的是为了确保数据库设计的合理...
    SnowflakeCloud阅读 41,126评论 0 48
  • CloudJavaBackendSummaries1、开发环境eclipse工程,引入jw仓库的jw-base,3...
    燕京博士阅读 1,197评论 0 0
  • 中秋节是民间传统的节日,人们都在八月15这天举行过节。 在这个节日里人们都喜欢带上月饼去探访亲戚。 中秋月饼的外形...
    邵雨乐阅读 384评论 0 0