简介
Spring Data 是spring的一个子项目,包含了一揽子具体数据库的子模块。本意是最具体的数据库进行封装,抽象一层更简单好用的模板,省去开发者配置、调试的时间,而把时间真正用在业务逻辑开发上。
特色:
- 强大的数据存储层和优秀的对象映射(ORM)
- 实现领域对象(Domain Object)且带有基础属性
- 支持透明的审计(创建时间、更新时间)
- 可以跟Spring轻松的整合,基于注解或者XML
- 与SpringMVC的控制器整合有高级特性
- 跨数据源持久化(实验特性)
小编注:
可以看出,大部分的特性并不是特别吸引我们。
引入spring data,特别是在spring boot之后,最大的好处就是简化了配置。
换句话说,几个注解,几行yml配置,一套数据源就整合进来了。省去了查询官方手册的时间。
支持范围
- JDBC : 就是我们学习java最开始用的,也是大部分orm框架的底层
- JPA : 国外更喜欢使用的ORM框架,国内使用Mybatis的更多。
- LDAP : 即LDAP,不解释
- REDIS : 数据结构或者叫KV存储,普遍被使用
- MONGODB : 文档数据库王者
- CASANDDRA / GEMFIRE / SOLR : 列式数据库、spring母公司pivotal的增强版redis 、lucene上层的搜索服务器
- 其他:支持Elasticsearch 、Neo4j 等存储,且有大量开源扩展
可以看出,国外的开发者其实与国内的喜好不完全一致。
orm我们喜欢mybatis,而国外使用jpa和hibernate的明显更多,mybatis份额很小。(参见stackoverflow调查)
列式数据库,我们hbase 相较 cassandra 用的更多。
一些云厂商、小厂商的数据库,我们几乎不会使用。
使用套路
spring data 这套组合实际上成熟度只能说一般般,但是使用起来确实方便。
配置几个注解。声明启用xxx 数据源;
配置几行yml。配置具体使用的连接参数;
spring data 会提供一个 xxxSessionFactory / xxxTemplate ,里面已经封装好了你想要的常见CRUD方法,业务上直接 @Autowired 引入即可。
但是。。。
一般的中小型项目,在时间紧迫、没有复杂需求的情况下,使用Spring data 没有任何问题。但是spring data 也不是完美的,主要有以下几个问题:
- spring 对数据库进行的2次封装,细节未必符合预期
拿elasticseach为例,官方加起来有多种java客户端,区分 high-level client 和 low-level client ,spring 选择的不一定是你想要的。统一管理的方法,为了抽象的需要,性能上不一定说的过去。
- spring 封装的方法未必够用
拿redis为例,如果需要一些 lua脚本操作、pipeline操作、循环 scan操作, spring 封装的template常常是不够用的,对象序列化的方式也不一定习惯。 到头来还得自己使用官方 jedis 客户端实现
- 版本冲突
spring 、 springboot 、springdata 、数据库的客户端 4者其实是有一定关系的。
低版本的springboot 可能不支持高版本的springdata , 当你的数据库(如 hbase)需要高版本客户端时,引入springdata 可能会导致被迫的springboot版本升级;
另外springdata 的版本必然是落后官方客户端的。
也是因此,一般有一定规模的企业,都会有自己封装的客户端,且在数据库版本上限定。减少开发和运维的适配工作。
小编本人所处的项目尝尝有用到一些高级功能或者定制功能(因为高并发对性能比较看重)。
因此都是使用官方的 redis、kafka、mongodb、hbase、es 客户端。但是这件事并不绝对,封装客户端使之更好用可能会花费一定的时间。
本文暂时没有评论,来添加一个吧(●'◡'●)