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

在本文中,我将介绍如何从无状态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

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

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

相关文章

开发流程补全

在开发过程中我意识到一个问题 具体问题就是我没有一个可靠的机制来防止自己犯错 现在的流程是 开发 调试 -> 测试同学 -> 上线 这里测试的时间会有点长&#xff0c;因为bug会有点多&#xff0c;然后需要修改bug&#xff0c;然后测试验证 改bug时间 理解测试bug描述…

Linux 锁机制

本文讨论了 Linux 内核中可用的大量同步或锁定机制。这些机制为 2.6 版内核的许多可用方法提供了应用程序接口&#xff08;API&#xff09; 。但是在深入学习 API 之前&#xff0c;首先需要明白将要解决的问题。 当存在并发特性时&#xff0c;必须使用同步方法。当在同一时间段…

CSS中越界问题经典解决方案

8.CSS相关知识 (1)如何解决父元素的第一个子元素的margin-top越界问题 1)为父元素加border-top: 1px;——有副作用 2)为父元素指定padding-top: 1px;——有副作用 3)为父元素指定overflow:hidden;——有副作用 4)为父元素添加前置内容生成——推荐使用 .parent:before { conten…

用可编写脚本的终结点遍历REST应用程序

我喜欢JDK附带ScriptEngine的事实。 当您要评估服务器环境中已经部署的应用程序并进行故障排除时&#xff0c;它非常灵活。 将此REST端点添加到Java EE应用程序中&#xff0c;它将使您可以立即访问该应用程序的内部状态。 package myrestapp;import java.io.StringReader; imp…

win7笔记本为手机共享wifi

1、cmd netsh wlan set hostednetwork modeallow ssidyourname keyyourpassword 开启win7的虚拟wifi&#xff0c;让电脑变成无线路由器 这时&#xff0c;网络连接中会多出一个网卡为“Microsoft Virtual WiFi Miniport Adapter”的无线连接2。如果没有&#xff0c;需要更新无线…

createjs中shape的属性regX和regY

官方文档说regX和regY是图形与注册点的距离。 那么注册点是什么呢&#xff1f; 我理解注册点就是图形的x/y对应的点图形动效的原点就是注册点 如果修改图形的regX和regY值图形在画布上的位置是会被改变的&#xff0c;但是注册点其实并没有被改变。因为图形的x/y值并没有被改…

CSS3里的display

默认值&#xff1a;inline 适用于&#xff1a;所有元素 继承性&#xff1a;无 动画性&#xff1a;否 none&#xff1a;隐藏对象。与visibility属性的hidden值不同&#xff0c;其不为被隐藏的对象保留其物理空间inline&#xff1a;指定对象为内联元素。block&#xff1a;指定…

H3C 单区域OSPF配置示例二

转载于:https://www.cnblogs.com/fanweisheng/p/11163688.html

身份反模式:联邦筒仓和意大利面条身份

分析公司Quocirca的最新研究证实&#xff0c;现在许多企业的外部用户比内部用户更多&#xff1a;在欧洲&#xff0c;有58&#xff05;的企业直接与其他企业和/或消费者的用户进行交易&#xff1b; 仅在英国&#xff0c;这一数字就达到了65&#xff05;。 如果您回顾历史&#x…

OpenSSL命令

Openssl Windows下编译过程1、下载openssl源代码以及相应的vc工程2、下载perl工具&#xff0c;如&#xff1a;ActivePerl-5.8.8.820-MSWin32-x86-274739.msi3、安装ActivePerl4、打开控制台程序&#xff0c;在openssl解压后的目录下执行Perl Configure VC-WIN32命令&#xff0c…

修改webpack的publicPath为动态设置以适配公司活动平台

背景&#xff1a; 我们需要将React开发的应用部署到一个活动搭建平台上&#xff0c;这意味我们只需要上传源码&#xff0c;没有搭建服务器的环节&#xff0c;没有配置Nginx的环节。具体步骤就是在该平台新建一个活动&#xff0c;然后将自己的源码传到这个活动下&#xff0c;然…

多个气泡向上冒出!

这里展示白色半透明气泡如下图&#xff1a;实际是动态 思路&#xff1a;HTML里只需要一个CANVAS元素&#xff0c;Javascript里操作canvas 1、给canvas里绘制背景图片 2、在绘制半径为0-10px的圆形&#xff0c;x坐标屏幕水平随机&#xff0c;y所标竖直大于屏幕高度。 圆形背景…

注入域对象而不是基础结构组件

依赖注入是Java&#xff08;以及许多其他编程语言&#xff09;中广泛使用的软件设计模式&#xff0c;用于实现控制反转 。 它提高了可重用性&#xff0c;可测试性&#xff0c;可维护性&#xff0c;并有助于构建松耦合的组件。 如今&#xff0c;依赖注入是将Java对象连接在一起的…

分享25个优秀的网站底部设计案例

相对于网站头部来说&#xff0c;关注网站底部设计的人很少。我们平常也能碰到有些网站的底部设计得很漂亮&#xff0c;给网站的呈现来一个完美的结尾。这篇文章收集了25个优秀的网站底部设计案例&#xff0c;一起欣赏。 me & oli La Bubbly Poogan’s Porch GiftRocket Lin…

wbepack中output.filename和output.chunkFilename

对于webpack配置中filename和chunkFilename在使用中有些不懂的地方&#xff0c;研究之后记录如下。 filename: string | function 此选项决定了每个输出 bundle 的名称。这些 bundle 将写入到 output.path 选项指定的目录下。 对于单个入口起点&#xff0c;filename 会是一个…

页面添加锚点后如何点击不改变URL?

直接奔主题&#xff0c;前端简单地锚点实现方法大家都会&#xff0c;无非就是在把 a 标签的 href 写成想要跳到的元素的id &#xff0c;比如点击 <a href"#box"></a> 页面就会自动滚动到 <div id"box"></div> 元素的位置。 那么这…

OP AMP - 反馈理论在运放中的应用

实际应用的系统绝大多数是闭环的&#xff0c;运放更是如此。 关于反馈理论&#xff0c;需要了解极点&#xff0c;零点&#xff0c;波特图&#xff0c;以及如何用相位裕度&#xff0c;幅值裕度 确定系统的稳定性&#xff0c;这里不作赘述 &#xff0c;不懂的部分可以到网上搜点…

具有Spring Boot和Java配置的Spring Batch教程

我一直在努力将Podcastpedia.org的一些批处理作业迁移到Spring Batch。 以前&#xff0c;这些工作是以我自己的方式开发的&#xff0c;我认为现在是时候使用一种更“标准化”的方法了。 因为我以前从未在Java配置中使用过Spring&#xff0c;所以我认为通过在Java中配置Spring B…

阅读react-redux源码 - 零

阅读react-redux源码 - 零阅读react-redux源码 - 一阅读react-redux源码(二) - createConnect、match函数的实现 react的技术栈一定会遇到redux&#xff0c;而在react中使用redux需要使用react-redux&#xff0c;那么react-redux是怎么包装redux已适用react的呢&#xff1f; …

kali linux 开启配置ssh服务

1. 一、配置SSH参数 修改sshd_config文件&#xff0c;命令为&#xff1a;vi /etc/ssh/sshd_config将#PasswordAuthentication no的注释去掉&#xff0c;并且将NO修改为YES //kali中默认是yes2. 将PermitRootLogin without-password修改为PermitRootLogin yes3. 然后&#xf…