mongodb连接java_如何从Java EE无状态应用程序连接到MongoDB

mongodb连接java

在本文中,我将介绍如何从无状态Java EE应用程序连接到MongoDB,以利用与MongoDB Java驱动程序提供的数据库的内置连接池。 如果您开发的REST API对MongoDB执行操作,则可能是这种情况。

获取Java MongoDb驱动程序

要将Java连接到MongoDB,可以使用Java MongoDB Driver 。 如果要使用Maven构建应用程序,则可以将依赖项添加到pom.xml文件中:

MongoDB Java驱动程序依赖性

org.mongodbmongo-java-driver2.12.3

该驱动程序为MongoDB客户端(com.mongodb.MongoClient)提供了内部池。 MongoClient类被设计为线程安全的并在线程之间共享。 对于大多数应用程序,整个JVM应该具有一个MongoClient安装。 因此,您不想在Java EE无状态应用程序中为每个请求创建一个新的MongoClient安装实例。

实现一个@Singleton EJB

一个简单的解决方案是使用@Singleton EJB来保存MongoClient:

Singleton持有MongoClient

package org.codingpedia.demo.mongoconnection;import java.net.UnknownHostException;import javax.annotation.PostConstruct;
import javax.ejb.ConcurrencyManagement;
import javax.ejb.ConcurrencyManagementType;
import javax.ejb.Lock;
import javax.ejb.LockType;
import javax.ejb.Singleton;import com.mongodb.MongoClient;@Singleton
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
public class MongoClientProvider {private MongoClient mongoClient = null;@Lock(LockType.READ)public MongoClient getMongoClient(){	return mongoClient;}@PostConstructpublic void init() {String mongoIpAddress = "x.x.x.x";Integer mongoPort = 11000;try {mongoClient = new MongoClient(mongoIpAddress, mongoPort);} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();}		}}

注意:

  • @Singleton –可能是此类中最重要的代码行。 此注释指定在应用程序中将仅存在一个这种类型的bean的单例。 该bean可以由多个线程同时调用。 它还带有@PostConstruct批注。 该注释用于需要依赖注入完成后才能执行任何初始化的方法上(在我们的情况下是初始化MongoClient)
  • @ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)声明单例会话bean的并发管理类型。 默认情况下,它设置为Container,在这里我仅使用它来突出显示它的存在。 另一个选项ConcurrencyManagementType.BEAN指定Bean开发人员负责管理对Bean实例的并发访问。
  • @Lock(LockType.READ)指定具有容器管理的并发性的单例bean的并发锁定类型。 设置为LockType.READ ,它将强制执行该方法以允许对其进行完全并发访问(假定未持有任何写锁)。 这允许多个线程访问相同的MongoClient实例,并利用与数据库的内部连接池。 这非常重要,因为另一个更保守的选项@Lock(LockType.WRITE)是DEFAULT并强制对bean实例的独占访问。 这应该在高度并发的环境中使方法变慢。

使用@Singleton EJB

现在您已经在应用程序中“保留了” MongoClient,您可以注入MongoClientProvider来访问MongoDB(例如,获取集合名称):

从其他bean示例访问MongoClient

package org.codingpedia.demo.mongoconnection;import java.util.Set;import javax.ejb.EJB;
import javax.ejb.Stateless;import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import com.mongodb.util.JSON;@Stateless
public class TestMongoClientProvider {@EJBMongoClientProvider mongoClientProvider;public Set<String> getCollectionNames(){MongoClient mongoClient = mongoClientProvider.getMongoClient();DB db = mongoClient.getDB("myMongoDB");		Set<String> colls = db.getCollectionNames();for (String s : colls) {System.out.println(s);}		return colls;}}

注意: db对象将是到指定数据库的MongoDB服务器的连接。 有了它,您可以进行进一步的操作。 我鼓励您阅读有关Java驱动程序入门的更多信息……

意识到

要记住的一方面:

“对于对数据库的每个请求(查找,插入等),Java线程都会从池中获取一个连接,执行该操作,然后释放该连接。 这意味着每次使用的连接(插座)可能不同。

此外,如果启用了slaveOk选项的副本集设置,则读取操作将在所有从属服务器上平均分配。 这意味着在同一个线程中,写入和读取之后的数据可能会发送到不同的服务器(主服务器然后是从服务器)。 反过来,由于复制是异步的,因此读取操作可能看不到刚刚写入的数据。 如果要确保“会话”(可能是http请求)中的完全一致性,则希望驱动程序使用相同的套接字,这可以通过使用“一致请求”来实现。 在执行操作之前调用requestStart(),然后调用requestDone()将连接释放回池:

确保完整的一致性

DB db...;
db.requestStart();
try {db.requestEnsureConnection();code....
} finally {db.requestDone();
} 

DBDBCollection是完全线程安全的。 实际上,它们是缓存的,因此无论如何您都可以得到相同的实例。” [3]

资源资源

  1. Java MongoDB驱动程序
  2. Java驱动程序入门
  3. Java驱动程序并发
  4. GitHub – mongodb / mongo-java-driver示例

翻译自: https://www.javacodegeeks.com/2014/10/how-to-connect-to-mongodb-from-a-java-ee-stateless-application.html

mongodb连接java

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339750.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学java专科_专科学历可以学习java开发吗

学习Java的热潮越来越高涨&#xff0c;除了转行而来的人&#xff0c;很多刚毕业的学生也加入到其中。很多人都觉得学习Java需要有一个高学历作为基础&#xff0c;一些专科生在学习之前会犹豫&#xff0c;他们是否能学习Java&#xff0c;首先学程序开发&#xff0c;入行Java开发…

具有InlfuxDB的Spring Boot和Micrometer第3部分:Servlet和JDBC

在上一个博客中&#xff0c;我们使用由InfluxDB支持的千分尺设置了反应式应用程序。 在本教程中&#xff0c;我们将使用传统的带JDBC阻塞式Servlet的Spring Stack。 我选择的数据库是postgresql。 我将使用与先前博客文章相同的脚本。 因此&#xff0c;我们将拥有初始化数据库…

java linkedlist实例_Java Linkedlist原理及实例详解

这篇文章主要介绍了Java Linkedlist原理及实例详解,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下定义&#xff1a;linkedlist属于链表结构&#xff0c;方便添加和删除元素&#xff0c;但查询不方便&#xff0c…

jsf xhtml调用方法_JSF的工作方式以及调试方法–可以使用polyglot吗?

jsf xhtml调用方法JSF不是我们通常认为的那样。 这也是一个调试起来可能有些棘手的框架&#xff0c;尤其是在初次遇到时。 在这篇文章中&#xff0c;让我们继续探讨为什么会出现这种情况&#xff0c;并提供一些JSF调试技术。 我们将讨论以下主题&#xff1a; JSF不是我们经常想…

java 分别编译_Java源文件和编译后的文件扩展名分别为()_学小易找答案

【单选题】( )下列关于逻辑运算符AND,描述正确的是哪一项?【单选题】如果声明一个类时使用abstract修饰符,则表明该类是()【填空题】要查询student表中name字段值以字符“m”开始,以字符“d”结束的记录应该在WHERE子句后跟 LIKE________。【填空题】不允许在关系中出现重复记…

将Auth0 OIDC(OAUTH 2)与授权(组和角色)集成

如果您正在使用Auth0对多个现有应用程序中的用户进行身份验证和授权&#xff0c;则可能需要将下一个Web应用程序与Auth0集成。 有多种方法可以执行此操作&#xff0c;例如&#xff0c;如果要将Jenkins与Auth0集成&#xff0c;则可以使用SAML v2&#xff1b;否则&#xff0c;可…

power of two java_LeetCode算法题-Power Of Two(Java实现)

这是悦乐书的第194次更新&#xff0c;第200篇原创01 看题和准备今天介绍的是LeetCode算法题中Easy级别的第56题(顺位题号是231)。给定一个整数&#xff0c;写一个函数来确定它是否是2的幂。例如&#xff1a;输入&#xff1a;1输出&#xff1a;true说明&#xff1a;2^0 1输入&a…

tomee_一罐将其全部统治:Apache TomEE + Shrinkwrap == JavaEE引导

tomee警告&#xff1a;我不是Spring Boot的专家。 我发现很多事情对此非常有趣&#xff0c;并且当然可以真正改善您的日常工作。 而且&#xff0c;我对Spring Boot没有任何反对&#xff0c;也没有开发或使用它的人。 但是我认为社区高估了该产品。 一年前&#xff0c;我开始收…

java比较equlse_java基础知识要点

一、抽象&#xff1a;二、封装&#xff1a;有了封装才有数据类型&#xff01;个体更多的设置为封装体&#xff0c;这样更加安全。该公开的公开(方法)&#xff0c;该隐藏的隐藏(属性)&#xff0c;配置一个访问窗口方法的调用(按值传递和按引用传递)1、在栈中分配空间(暂时给方法…

使用Spring Boot和Project Reactor处理SQS消息

我最近参与了一个项目&#xff0c;在该项目中&#xff0c;我不得不有效地处理通过AWS SQS Queue流入的大量消息。 在这篇文章&#xff08;可能还有一篇&#xff09;中&#xff0c;我将介绍使用出色的Project Reactor处理消息的方法。 以下是我要进行的设置&#xff1a; 设置本…

java commons lang 随机数_Apache Common-lang组件里随机数工具类RandomStringUtils的一个bug...

现在本文也转到了我自己的博客上&#xff0c;地址&#xff1a;月城小馆Apache Common组件是java开发中常用的工具&#xff0c;其中的common-lang包是java基本数据类型的处理工具&#xff0c;包括数字、字符串、日期时间等多种工具类。在org.apache.commons.lang包中有一个随机数…

初级测试开发面试题_初级开发人员在编写单元测试时常犯的错误

初级测试开发面试题自从我编写第一个单元测试以来已经有10年了。 从那时起&#xff0c;我不记得我已经编写了成千上万的单元测试。 老实说&#xff0c;我在源代码和测试代码之间没有任何区别。 对我来说是同一回事。 测试代码是源代码的一部分。 在过去的3-4年中&#xff0c;我…

java文件读写详细介绍_java文件读写操作大全

一.获得控制台用户输入的信息public String getInputMessage() throws IOException...{System.out.println("请输入您的命令∶");byte buffer[]new byte[1024];int countSystem.in.read(buffer);char[] chnew char[count-2];//最后两位为结束符&#xff0c;删去不要f…

使用SoapUI调用安全WCF SOAP服务–第1部分,该服务

在这个由三部分组成的传奇中&#xff0c;我将演示如何使用SoapUI API工具来调用安全的SOAP服务。 首先&#xff0c;我将专注于创建服务&#xff0c;在接下来的文章中它将充当被测系统。 使用基本身份验证传输安全性机制维护对该服务中资源的访问。 Windows Communication Foun…

java简单系统_Java简单学生管理系统

Java简单学生管理系统这个不需要手动输入&#xff0c;笔记记录//studentpublic class student(){private String id;//学号private String name;//姓名private int age;//年龄public String getId() {return id;}public void setId(String id) {this.id id;}public String get…

github和maven_在github上托管Maven存储库(包含源代码和javadoc)

github和maven如何通过maven使其他开发人员可以使用小型开源库&#xff1f; 一种方法是将其部署在Maven Central Repository上 。 我想要做的是将其部署到github &#xff0c;因此我可以自由地对其进行修改。 这篇文章将告诉您如何做到这一点。 我将工件部署到github的典型方法…

kafka java编程demo_Kafka简单客户端编程实例

今天&#xff0c;我们给大家带来一篇如何利用Kafka的API进行客户端编程的文章&#xff0c;这篇文章很简单&#xff0c;就是利用Kafka的API创建一个生产者和消费者&#xff0c;生产者不断向Kafka写入消息&#xff0c;消费者则不断消费Kafka的消息。下面是具体的实例代码。一、创…

java我的世界极限生存_我的世界 1.7.10 极限生存整合包

整合包介绍&#xff1a;最近总有人觉得Minecraft很无聊&#xff0c;没有什么可玩的&#xff0c;或者觉得生存太简单 那么就来试试这个吧&#xff0c;全部是增强怪物的MOD&#xff0c;保证不无聊&#xff0c;保证不简单 基本上没有增加一些新的东西&#xff0c;只增加了几种怪物…

具有InlfuxDB的Spring Boot和Micrometer第1部分:基础项目

对于那些关注此博客的人来说&#xff0c;难怪我倾向于大量使用InfluxDB。 我喜欢这样一个事实&#xff0c;它是一个真正的单一用途的数据库&#xff08;时间序列&#xff09;&#xff0c;具有许多功能&#xff0c;并且还带有企业支持。 Spring也是我选择的工具之一。 因此&…

Gradle善良:仅添加包装用于战争

我的同事Tom Wetjens 在Maven中撰写了博客文章仅打包依赖项 。 当我们想在WAR文件中包含依赖项时&#xff0c;他展示了一种Maven解决方案&#xff0c;而在其他任何作用域中都没有使用。 在这篇博客中&#xff0c;我们将看到我们如何在Gradle中解决这个问题。 假设我们在项目中…