共计 5822 个字符,预计需要花费 15 分钟才能阅读完成。
在 Java 的 NoSQL 解决方案畛域中,有几种解决方案和不同的类型,这是本文的第一局部。然而,除了按键之外,还有平台。平台是一组有助于应用 NoSQL 数据库的工具。在本文中,您将要探讨平台:Java 的以后环境中的定义和现有解决方案。
开始探讨 NoSQL 平台的重要一点是,就像 NoSQL 形容自身一样,没有繁多的定义。依据每个作者的文献和教训,它可能有所不同。通常,NoSQL 解决方案平台是用于解决数据库的一组工具。也就是说,除了 API 之外,还会有其余工具。
思考到现有平台,除了 API 自身外,它们还由四点组成。
依赖注入:这是一个基于容器的框架,用于注入依赖或反转管制,以促成应用程序中不同零碎模块之间的涣散耦合。
模板:思考映射 API。其次要目标是解释一个或多个数据库的操作,以缩小学习曲线以及谬误或谬误。
存储库接口:思考 DDD,它将负责捕捉实体的域并全副或局部形象 Java 开发人员的实现。例如,框架的用户创立一个界面,开发一些办法,平台自身将负责实现这些性能。
配置:咱们从《十二个因素》中学到了不要保留诸如用户名和明码之类的要害信息硬编码的重要性。解决方案中此工具的次要指标是促成第三个因素的良好实际:配置。
思考到这些状况,咱们能够列举目前在 Java 和 NoSQL 世界中的五个平台解决方案:
Quarkus
Micronaut
Hibernate OGM
Spring
Jakarta NoSQL
因为本文的目标是取得平台的概述,因而,在第一点上,将仅应用 MongoDB 和具备某些属性的 Philosopher 实体通过 API 的简略演示来摸索组件。
休眠 OGM
当主题是数据持久性(即 JPA)时,休眠 OGM 遵循基于 Java 开发人员家喻户晓的 API 的解决方案的前提。因而,因为开发人员通常曾经晓得此 API,所以它的一大劣势就是领有简洁的学习程度。
然而,在某些解决方案中,仿真往往成为累赘,例如,Cassandra 中的事务或隐式批示关系而不是非规范化关系。反对交易的银行也是如此。只管它反对此性能,然而 MongoDB 不太适宜频繁应用,因为此性能会带来微小的计算能力老本。
益处:
它应用 Java 社区已知的 API
学习曲线低
JPQL 的应用
毛病:
为 NoSQL 数据库中应用的关系数据库创立的 API 会产生更大的阻抗,从而在计算成本上造成更大的损失。
应用 Hibernate 的第一步是配置,因而是经典的 persistence.xml。如上所述,这偏向于使在代码内部应用设置具备挑战性。
<persistence-unit name="ogm-mongodb" transaction-type="JTA">
<provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider>
<properties>
<property name="hibernate.ogm.datastore.provider" value="MONGODB" />
<property name="hibernate.ogm.datastore.database" value="TestDB" />
<property name="hibernate.ogm.datastore.create_database" value="true" />
</properties>
</persistence-unit>
下一步是创立和建模哲学家实体。如前所述,对于曾经领有 JPA 教训的开发人员来说,并不是什么陈腐的货色。
@Entity
public class Philosopher {
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
private String id;
private String name;
@ManyToOne
private Book books;
}
在最初一个代码点中,与数据库进行交互和操作。就像在 JPA 中一样,终点将在 EntityManager 中产生。
Philosopher socrates = ...;
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("ogm-mongodb");
EntityManager entityManager = entityManagerFactory.createEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
transactionManager.begin();
entityManager.persist(socrates);
transaction.commit();
entityManager.close();
Quarkus
Quarkus 是在过来几年中取得宽泛欢送的解决方案之一。它基于一种防止反射的解决方案,从而改善了启动和初始内存耗费。红帽作为次要赞助商,其最突出的性能是敌对的 API,并靠近 Java 世界现有规范。
益处:
Quarkus 十分靠近规范。Java 世界中曾经存在 API,例如 MicroProfile 和 Jakarta EE。
该解决方案同时反对存储库概念和 ActiveRecord
毛病:
在 Quarkus 上 NoSQL 内的反对依然无限。
第一步是配置;依照 MicroProfile 配置,能够将该信息搁置在例如要在本地环境中应用的属性文件中,并且能够笼罩以用于生产中。
quarkus.mongodb.connection-string = mongodb:// 本地主机:27017
Quarkus 的哲学家类反对 Active Record,因而能够在实体中搁置操作。此性能的简略性很乏味。然而,存在惟一责任的问题。此性能来自于 Panache。
public class Philosopher extends PanacheMongoEntity {
public String name;
public List<String> quotes;
public static Philosopher findByName(String name){return find("name", name).firstResult();}
}
除了 Active Record 操作之外,还可能不应用此资源或将此资源与存储库概念一起应用。
@ApplicationScoped
public class PhilosopherRepository implements PanacheMongoRepository<Philosopher> {public Philosopher findByName(String name){return find("name", name).firstResult();}
}
在交互中,可能会看到有可能同时解决 Active Record 和存储库应用问题。
Philosopher aristotle = ...;
aristotle.persist();
aristotle.update();
aristotle.delete();
repository.persist(aristotle);
repository.update(aristotle);
repository.delete(aristotle);
Micronaut
在目前防止应用 Reflection 的现有解决方案中,到目前为止,它是波及喷射引擎或管制反转的最无效解决方案。对于那些习惯应用像 Reflection 这样的 API 并想理解一点本机 API 的人来说,Micronaut 是一种天然的形式(只管目前有一些使 Spring 反对本机模式的工作)。
益处:
与以后的规范(例如 Spring)相比,Micronaut 的特色在于 API 十分靠近。
毛病:
与下一个数据库相比,对 NoSQL 数据库的反对依然无限。
Micronaut 的配置将与反对此类性能的框架遵循雷同的准则,因而能够实现第三个利用因素的劣势。实体类仅须要自省正文。
@Introspected
public class Philosopher {
private String name;
private List<String> quotes;
//getter and setter
}
如前所述,Micronaut 对 NoSQL 数据库没有太多反对。它应用 MongoClient,这是一种通信级别的 API。
public class PhilosopherService {
private final MongoClient mongoClient;
public PhilosopherService(MongoClient mongoClient) {this.mongoClient = mongoClient;}
public Philosopher show(String name) {Bson filter = Filters.eq("name", name);
return getCollection().find(filter).first();}
public Iterable<Philosopher> findAll() {final FindIterable<Philosopher> iterable = getCollection().find();
return StreamSupport.stream(iterable.spliterator(), false)
.collect(Collectors.toList());
}
public void save(Philosopher philosopher) {getCollection().insertOne(philosopher);
}
private MongoCollection<Philosopher> getCollection() {
return mongoClient
.getDatabase("main")
.getCollection("Philosopher", Philosopher.class);
}
}
Spring
在 Java 世界中反对 NoSQL 的平台中,Spring 无疑是领有最重要数据库的平台。它具备最出色的成熟度,并且是对各种 NoSQL 数据库的特定性能提供最出色反对的解决方案。
益处:
当波及到 Java 和 NoSQL 时,这是最成熟,资源最丰盛的平台。
具备对 Spring 系列所有组件的集成和反对
毛病:
Spring 是最具创新性的工具之一,就像 Spring Data 2.0 版一样,它往往更容易毁坏兼容性。
设置配置的工作形式与 Micronaut 十分类似,包含配置灵活性。正文十分分明。它须要 Document 批注定义类,而 ID 批注定义实体 ID。
@Document
public class Philosopher {
@Id
private String id;
private String name;
private List<String> quotes;
//getter and setter
}
思考 Spring 中的 MongoDB API,它反对存储库的概念以及 MongoTemplate 类对模板的应用。除了应用对开发人员具备神奇作用的存储库之外,还必须创立接口,整个实现将由 Spring 负责。
@Repository
public interface PhilosopherRepository extends MongoRepository<Philosopher, String> {
}
Philosopher plato = ...;
mongodbTemplate.insert(plato);
mongodbTemplate.update(plato);
repository.save(plato);
repository.delete(plato);
repository.findOne(plato.getId());
Jakarta NoSQL
Jakarta NoSQL 是 Jakarta EE 流程中的第一个标准。其目标是实现 Java 与 NoSQL 之间的集成。它最不堪设想的性能是应用市场上可用的最佳实际和工具。
益处:
它受到市场上良好实际的启发,例如 Spring 中的 Repository 性能。
它具备对 Jakarta EE / MicroProfile 系列所有组件的集成和反对。
毛病:
Jakarta NoSQL 尚未公布最终版本,因而依然容易受到 API 毁坏的影响
配置和灵活性取决于 MicroProfile Config,因而与 Quarkus 雷同。这些实体具备雷同的 JPA 词汇。然而,它们应用正文自身。关键点是,与 JPA 不同,必须留神将保留的所有字段。
@Entity
public class Philosopher {
@Id
private String id;
@Column
private String name;
@Column
private List<String> quotes;
}
如前所述,Jakarta NoSQL 在很多方面都应用 Spring Data 作为灵感起源,包含存储库性能。
@Repository
public interface PhilosopherRepository extends Repository<Philosopher, String> {}
因而,能够同时应用带有 DocumentTemplate 类的模板资源和存储库资源。该 API 的显着劣势是促成数据库之间的替换。通常,能够在数据库文档之间进行切换,例如从 MongoDB 到 ArangoDB,并且影响尽可能小。
Philosopher thalesMiletus = ...;
mongodbTemplate.insert(thalesMiletus);
mongodbTemplate.update(thalesMiletus);
repository.save(thalesMiletus);
repository.delete(thalesMiletus);
repository.findById(thalesMiletus.getId());
须要学习材料能够加群收费支付:3907814
在本文中,咱们探讨了什么是平台,平台的最小组件以及 Java 环境中的一些示例。Java 世界的一大亮点是 Java 世界中解决方案的多样性,这阐明了一个充满生机和生机的社区。