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

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

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

    mongodb连接java 在本文中,我将介绍如何从无状态Java EE应用程序连接到MongoDB,以利用与MongoDB Java驱动程序提供的数据库的内置连接池. 如果您开发的REST API对 ...

  2. java 编写无状态代码,一种真正实现RMI无状态化的方法续:JVM源码修改步骤

    下面详细讲解如何修改JVM源码解决RMI的有状态化问题. 从JVM源码可以看到,client通过控制链得到对象ID后,走数据链发送到RMI Server,Server的查找过程如下: target = ...

  3. Eclipse Java EE 开发 Web 应用程序

    1.创建Web项目 File->New->Dynamic Web Project Project Name输入项目名称 Target runtime->New Runtime 选择A ...

  4. spring 多租户_使用Spring Security的多租户应用程序的无状态会话

    spring 多租户 从前, 我发表了一篇文章,解释了构建无状态会话的原理 . 巧合的是,我们再次为多租户应用程序执行同一任务. 这次,我们将解决方案集成到Spring Security框架中,而不是 ...

  5. 使用Spring Security的多租户应用程序的无状态会话

    从前, 我发表了一篇文章,解释了构建无状态会话的原理 . 巧合的是,我们再次针对多租户应用程序执行同一任务. 这次,我们将解决方案集成到Spring Security框架中,而不是自己构建身份验证机制 ...

  6. 如果REST应用程序应该是无状态的,那么如何管理会话?

    我需要一些澄清. 我一直在阅读有关REST和构建RESTful应用程序的内容. 根据维基百科,REST本身被定义为具象国家转移 . 因此,我不理解每个人都在喷涌的所有这种无国籍的gobbledeygo ...

  7. 怎么用java ee编程_Java EE应用程序入门 - 编程入门网

    Java EE应用程序入门 时间:2011-07-06 netbeans.org 本文将详细介绍使用 EJB 3.0 技术开发企业应用程序的基础知识,而 EJB 3.0 是 Java EE 5 平台的 ...

  8. netbeans连接数据库_NetBeans Java EE技巧3:数据库中的RESTful Web服务

    netbeans连接数据库 许多现代的Web应用程序正朝着使用HTTP使用无状态通信的方向发展. REST(表示状态转移)体系结构样式通常用于设计网络应用程序,而使用Java EE 7,很容易开发用于 ...

  9. java ee maven_针对新手的Java EE7和Maven项目–第1部分–简单的Maven项目结构–父pom...

    java ee maven 为什么呢 很多时候,我在日常工作中试图解决一些基本或复杂的Maven / Java EE项目结构问题. 为了提供解决方案,我经常最终会尝试项目结构,测试我在不同应用程序服务 ...

最新文章

  1. 股市币市:数据分析与交易所最新公告(20190303)
  2. 《男人这东西》—— 读后总结
  3. mysql基础(九) 索引和视图
  4. iview table 自定义列_案例 | iview中Table:拖拽适配列、自定义固定列、合并行
  5. Controller 如果能保持单例,尽量使用单例
  6. Java基础之重写与重载深入解析
  7. 计算机软件系统包括应用软件和什么,计算机软件系统包括什么
  8. 学好python工资一般多少-参加Python培训就业薪资是多少?老男孩学Python好吗?
  9. 操作系统部分知识点(持续更新)
  10. #《神奇动物:邓布利多之谜》
  11. php ppt如何转换成pdf,ppt转pdf格式转换器 PPT批量转换成PDF 怎样把PPT格式转换成PDF格式...
  12. Cpp环境【CQYZOJ3145】【CQOI2916】学生宿舍依法集会权遭受侵害案例
  13. axure 8 表格合并_Word页面布局、“插入”选项卡及表格部分考点梳理
  14. jquery alert重写,不弹出错误提示
  15. java查询日期类的表,JAVA菜鸟入门篇 - 时间处理相关类实例:打印该月日期表 (29)...
  16. html5/Css3 网页设计 带音乐与食品模块
  17. HTML5 Canvas | w3cschool菜鸟教程
  18. 桁架工业机器人编程_桁架机器人规划设计,工业软件开发
  19. 微信收款助手消息不弹窗的解决办法
  20. clion调整字体打下奥_Clion、IEDA、pycharm的一些简单设置(输出中文、字体大小、背景颜色主题)...

热门文章

  1. 数组中一种数出现奇数次和两种数出现奇数次
  2. stream 提取某字段_java8从list集合中取出某一属性的值的集合案例
  3. super构造方法为什么给子类赋值_【Java学习 | Javase】super
  4. (转)Spring Boot通过ImportBeanDefinitionRegistrar动态注入Bean
  5. 转:Kafka、RabbitMQ、RocketMQ等消息中间件的介绍和对比
  6. 在 eclipse 中 设置 jvm 的 运行时目录
  7. tomcat(15)Digester库
  8. cassandra 备份_使用sstableloader恢复Cassandra Priam备份
  9. aws ec2 选择可用区_AWS Messaging Services:选择合适的服务
  10. aws ecr_在ECR上推送Spring Boot Docker映像