1

在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会产生更大的阻抗,从而在计算成本上造成更大的损失。

image.png

使用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内的支持仍然有限。
image.png
第一步是配置;按照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数据库的支持仍然有限。
image.png
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版一样,它往往更容易破坏兼容性。image.png
设置配置的工作方式与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破坏的影响image.png
配置和灵活性取决于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世界中解决方案的多样性,这说明了一个充满生机和活力的社区。


Java攻城师
451 声望391 粉丝

本人太过于丰富,无法简介