java 轻量级文件数据库
基于云的Java数据库应用程序的数量每分钟都在增加。 许多组织部署了数百甚至数千个微服务实例。 但是,相对于运行时环境,大多数应用程序会带来惊人的不必要开销。 反过来,这会使应用程序运行更慢,运行成本更高。
在本文中,我将演示如何编写比normal(*)小10倍的数据库应用程序。 考虑到应用程序,第三方库和Java运行时,存储要求约为32 MB,而不是通常的(*)〜300 MB。 另外,运行该应用程序所需的RAM也将减少25%。
(*)这些是以下完整JDK(不包括应用程序和第三方库)的存储要求:
jdk.8.0_191 360 MB
jdk-9.0.4 504 MB
adoptopenjdk-11 298 MB
使用支持微服务的ORM
大多数传统的ORM不支持Java模块封装。 通常,这需要交付大量不必要的代码。
在本文中,我将使用开源的基于Stream的Java ORM Speedment ,它的最新版本支持Java Platform Module System(JPMS)。 这使我们能够仅使用我们的应用程序显式使用的模块来生成优化的自定义Java运行时环境(JRE,来自JDK的部分,用于运行应用程序)。
阅读关于Speedment 3.2中的新功能, 这篇文章 。
应用程序
我们希望在本文中部署的整个应用程序位于
GitHub上的开源项目,位于子目录“ microservice-jlink
”下。 它连接到托管在云中MySQL“ Sakila”数据库(包含有关电影的数据)的公共实例,并在控制台上列出了十个最长的被评为“ PG-13”的电影。 数据模型已预先配置为适合此数据库的数据结构。 如果要使用另一个数据库创建自己的应用程序,请访问Speedment初始化程序以专门为该数据库配置项目。
该应用程序的main
方法如下所示:
public final class Main {
public static void main(String[] args) {
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() // 1
.filter(Film.RATING.equal("PG-13")) // 2
.sorted(Film.LENGTH.reversed()) // 3
.limit(10) // 4
.map(film -> String.format( // 5
"%-18s %d min",
film.getTitle(),
film.getLength().orElse(0))
)
.forEach(System.out::println); // 6
}
}
首先,我们将数据库密码传递给Speedment构建器(Speedment从不在内部存储密码)。 使用配置文件中的数据库IP地址,端口等对构建器进行了预配置。
然后,我们获得FilmManager
,该FilmManager
器随后可用于创建直接与数据库中“ film”表相对应的Java流。
最后,我们:
- 创建
Film
实体Stream
- 筛选出评级等于“ PG-13”的
Film
实体 - 以相反的长度顺序对剩余的影片进行排序(最长的优先) <