文章目录
- Micronaut Data:把数据库查询挪到编译期去做
- 1、它解决了什么问题
- 2、和 Spring Data 比改了什么
- 3、怎么上手
- 4、什么人会需要它
- 5、文档和发布
Micronaut Data:把数据库查询挪到编译期去做
micronaut-data 在 GitHub 上目前有 480 Star。
Micronaut 团队开源的这个数据访问工具包,专门解决一件事:用 Ahead of Time 编译把仓库接口的查询预先算好,运行时只剩一层薄薄的执行层。
1、它解决了什么问题
写过 Spring Data 或者 GORM 的人都熟悉那套机制:在 Java 接口上写个方法名,框架运行时用正则匹配加上动态代理把方法名翻译成 SQL。灵活是灵活,代价也不小。
运行时元模型靠反射维护实体之间的关系,应用越大内存吃得越多。本身 Hibernate 就有一套元模型,叠加起来等于同一个内存里存了两份。方法名到查询的翻译也是运行时干的活,每次启动都要走一遍。
Micronaut Data 把这些事全挪到编译期。元模型在编译阶段生成,查询在编译阶段算好,运行时不需要反射,也不需要动态代理。栈帧更短,内存占用更低,启动也更快。
2、和 Spring Data 比改了什么
灵感来自 GORM 和 Spring Data,但在几个关键点上做了取舍。
编译期元模型:实体关系的建模直接挪进编译器,运行时不再维护那套反射元模型。骨子里 Hibernate 该用的反射还会用,但 Micronaut Data 这层没有了。
无查询翻译:方法名到查询的映射在编译阶段完成,运行时不做这件事。框架该做的事编译时一次做掉,剩下执行。
无反射无运行时代理:仓库接口的实现是编译期生成的代码,不是运行时织出来的代理。栈跟踪会更干净,反射缓存这部分内存开销也省了。
类型安全:编译期会主动检查仓库方法能不能实现,实现不了直接编译失败。运行时才发现方法名写错这种事,提前到编译阶段报出来。
3、怎么上手
最方便的入口是 Micronaut Launch,浏览器打开选 feature,或者一行 curl 拉一个配好依赖的工程下来。
要 JPA 方案:
curl https://launch.micronaut.io/demo.zip?features=data-jpa -o demo.zip unzip demo.zip -d demo要 JDBC 方案就把 feature 换成>4、什么人会需要它
已经在 Micronaut 生态里、想用 Spring Data 那套写法但不开运行时代理代价的团队。
对启动时间和内存占用敏感的服务,尤其是 GraalVM 原生镜像场景。Reflection 和运行时代理在原生镜像里本就要剔除,Micronaut Data 的编译期方案正好契合。
需要类型安全、希望编译期就发现仓库方法实现问题的项目。运行时炸比编译期炸难受得多。
5、文档和发布
完整文档在 Micronaut 官方文档站,快照版本发布到 JFrog OSS,正式版本通过 GitHub Actions 发布到 Maven Central。版本管理走语义化版本号,发版流程在 README 里写得很清楚:改 gradle.properties 里的 projectVersion,打 tag,等 CI 跑完。
楚:改 gradle.properties 里的 projectVersion,打 tag,等 CI 跑完。