在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教训的开发人员来说,并不是什么陈腐的货色。

@Entitypublic 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操作之外,还可能不应用此资源或将此资源与存储库概念一起应用。

@ApplicationScopedpublic 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的配置将与反对此类性能的框架遵循雷同的准则,因而能够实现第三个利用因素的劣势。实体类仅须要自省正文。

@Introspectedpublic 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。

@Documentpublic class Philosopher {    @Id    private String id;    private String name;    private List<String> quotes;    //getter and setter}

思考Spring中的MongoDB API,它反对存储库的概念以及MongoTemplate类对模板的应用。除了应用对开发人员具备神奇作用的存储库之外,还必须创立接口,整个实现将由Spring负责。

@Repositorypublic 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不同,必须留神将保留的所有字段。

@Entitypublic class Philosopher {    @Id    private String id;    @Column    private String name;    @Column    private List<String> quotes;}

如前所述,Jakarta NoSQL在很多方面都应用Spring Data作为灵感起源,包含存储库性能。

@Repositorypublic 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世界中解决方案的多样性,这阐明了一个充满生机和生机的社区。