几种传统的ORM不能完全遵循Java模块封装(JPMS)。 这通常意味着在部署微服务时会使用很多不必要的文件和类。 最新的主要版本3.2的开源
Speedance通过引入模块系统支持来解决此问题,该模块支持对云应用程序进行有效部署并提供更严格的API。
在本文中,您将学习Speedment 3.2的新增功能以及如何部署体积缩小10倍且使用更少内存的云数据库应用程序。
支持Java平台模块系统(JPMS)
Speedment 3.2的最大功能无疑是对JPMS的本地支持。 现在,Speedment中的每个模块都包含自己的模块
module-info.java
文件,并采用严格的封装。
作为开发人员,使用模块系统完全是可选的,并且由于其多版本的JAR,Speedment仍然可以在Java 8下运行。您可以选择现在,以后或从不迁移到JPMS。
其他ORM,例如Hibernate,可能支持JPMS的某些部分,但不遵循严格的封装(例如,要求
--add-opens
手动添加,从而绕过保护措施以防止访问内部/受保护的类)。
可选模块允许较小的微服务
Speedment模块已在内部进行了重组,以减少模块之间的耦合。 结果,某些模块现在是可选的,从而允许部署甚至更小的微服务。 例如,现在可以分别选择各种数据库连接器,并且
JoinComponent
也是可选的。
缩小尺寸
不再需要多个内部模块(例如“惰性”和“可变流”),并且对其他一些内部模块进行了优化并减小了尺寸。
强封装
由于有了模块系统,内部类现在被完全隐藏,甚至受到保护,免于深度反射。 这会增强API(因为仅可以访问故意可见的类和方法),因此可以在不影响公共API的情况下将来迁移内部类。
云部署示例
与在标准JDK下运行应用程序相比,可以创建一个自定义JRE +应用程序+加速库,该库小10倍,并且使用的内存减少了25%。 如果您在云中运行大量微服务,那么这将带来巨大的差异。
我的文章“
Java:如何创建轻量级数据库微服务 ”。 数据库应用程序连接到带有电影,演员等的“ Sakila”数据库的公共MySQL云实例。它检索十个最长的电影,并按长度顺序将它们打印在控制台上。
定制的JRE仍然具有真正的JVM的所有优势,例如垃圾收集,JIT编译器等。只是已删除的未使用模块和工具。
final Speedment app = new SakilaApplicationBuilder()
.withPassword( "sakila" )
.build(); final FilmManager films = app.getOrThrow(FilmManager. class ); System.out.println( "These are the ten longest films rated as PG-13:" ); films.stream()
.filter(Film.RATING.equal( "PG-13" ))
.sorted(Film.LENGTH.reversed())
.limit( 10 )
.map(film -> String.format(
"%-18s %d min" ,
film.getTitle(),
film.getLength().orElse( 0 ))
)
.forEach(System.out::println);
该应用程序将产生以下输出:
These are the ten longest films rated as PG- 13 : GANGS PRIDE 185 min CHICAGO NORTH 185 min POND SEATTLE 185 min THEORY MERMAID 184 min CONSPIRACY SPIRIT 184 min FRONTIER CABIN 183 min REDS POCUS 182 min HOTEL HAPPINESS 181 min JACKET FRISCO 181 min MIXED DOORS 180 min
事实证明,与仅占用30 MB(甚至包括应用程序和Speedment运行时)的定制JRE相比,标准开放JDK 11的存储要求为300 MB。 因此,可以将存储需求减少大约90%。 在检查堆使用情况时
jmap
结论是,RAM使用量也减少了约25%。
如何获得速度3.2
新用户可以使用以下工具下载Speedment 3.2
初始化器 。
现有用户只能在其用户中更新速度版本
pom.xml
文件,并通过发出以下命令来重新生成域模型:
mvn speedment:generate
而已。 现在,您的旧Speedment应用程序将在新版本下运行。
如果要使用模块系统,请添加以下内容
module-info.java
文件到Java 8+应用程序的根目录:
module your.module.name {
requires com.speedment.runtime.application;
requires com.speedment.runtime.connector.mysql; // (*) }
(*)根据数据库类型,您必须将MySQL模块替换为数据库的相应模块。 阅读有关各种数据库连接器模块的所有信息
在这里 。
资源资源
JPMS模块的基础知识
完整的Speedment版本说明历史记录可以在这里找到 在GitHub上加速 Speedment Initializer能够生成项目模板