当前位置: 首页 > 知识库问答 >
问题:

使用Morphia(Java)连接到MongoDB

呼延智明
2023-03-14

我正在开发一个Java的Restful Web应用程序,并计划将MongoDB与吗啡用作ODM。由于我是MongoDB的新手,我需要一些建议。

>

  • 处理db连接的最佳方法是使用db连接池,mongoClient负责处理。

    Morphia morphia = new Morphia();   
    ServerAddress addr = new ServerAddress("127.0.0.1", 27017);  
    String databaseName = "test";  
    MongoClient mongoClient = new MongoClient(addr);  
    Datastore datastore = morphia.createDatastore(mongoClient, databaseName); 
    

    所以我需要重用上面的数据存储,而不是在每次请求时创建一个新实例,因为它会浪费大量资源并影响性能。我应该将上述实现为单例类吗?有人能帮我解决这个问题吗?

  • 共有2个答案

    方高丽
    2023-03-14

    你可以像这样:

    private MongoClient mongoClient = null;
    private String mongoUrl="xxxx";//You can also use spring injection,@Value(value = "${db.mongo.url}")
    
    private static final Morphia MORPHIA = new Morphia();
    
    public Datastore getMORPHIADB(String dbName) {
        if (mongoClient == null) {
            //初始化
            init();
        }
        return MORPHIA.createDatastore(mongoClient, dbName);
    }
    
    @PostConstruct
    public void init() {
        try {
            //此处其它参数我们不做配置,采用默认配置MongoClientOptions.Builder里面配置连接池的参数
            MongoClientOptions.Builder options = new MongoClientOptions.Builder()
                    .connectionsPerHost(30);  //连接池大小(默认初始化为100个,原来老版本是10个)
            MongoClientURI mongoClientURI = new MongoClientURI(mongoUrl, options);
            mongoClient = new MongoClient(mongoClientURI);
        } catch (MongoClientException e) {
            LOGGER.error("建立MongoClient异常");
        }
    }
    
    @PreDestroy
    public synchronized void closeConnection() {
        if (mongoClient != null) {
            mongoClient.close();
        }
    }
    

    当需要使用时,您可以这样做:private Datastore Datastore=mongoConnService。getMORPHIADB(“xxx”);

    舒博雅
    2023-03-14

    查看这个演示github中的配置。com/xeraa/morphia演示

        /**
         * MongoDB providing the database connection for main.
         */
        public class MongoDB {
    
          public static final String DB_HOST = "127.0.0.1";
          public static final int DB_PORT = 27017;
          public static final String DB_NAME = "morphia_demo";
    
          private static final Logger LOG = Logger.getLogger(MongoDB.class.getName());
    
          private static final MongoDB INSTANCE = new MongoDB();
    
          private final Datastore datastore;
    
          private MongoDB() {
            MongoClientOptions mongoOptions = MongoClientOptions.builder()
            .socketTimeout(60000) // Wait 1m for a query to finish, https://jira.mongodb.org/browse/JAVA-1076
            .connectTimeout(15000) // Try the initial connection for 15s, http://blog.mongolab.com/2013/10/do-you-want-a-timeout/
            .maxConnectionIdleTime(600000) // Keep idle connections for 10m, so we discard failed connections quickly
            .readPreference(ReadPreference.primaryPreferred()) // Read from the primary, if not available use a secondary
            .build();
            MongoClient mongoClient;
            mongoClient = new MongoClient(new ServerAddress(DB_HOST, DB_PORT), mongoOptions);
    
            mongoClient.setWriteConcern(WriteConcern.SAFE);
            datastore = new Morphia().mapPackage(BaseEntity.class.getPackage().getName())
            .createDatastore(mongoClient, DB_NAME);
            datastore.ensureIndexes();
            datastore.ensureCaps();
            LOG.info("Connection to database '" + DB_HOST + ":" + DB_PORT + "/" + DB_NAME + "' initialized");
          }
    
          public static MongoDB instance() {
            return INSTANCE;
          }
    
          // Creating the mongo connection is expensive - (re)use a singleton for performance reasons.
          // Both the underlying Java driver and Datastore are thread safe.
          public Datastore getDatabase() {
            return datastore;
          }
        }
    
     类似资料:
    • 我试图使用Morphia从使用Mongo V3.6.4的mongodb.Im中读取内容。我已经添加了Morphia依赖关系: 现在我尝试连接到我的MongoDB: Mongo肯定是像我以前的连接代码一样运行...

    • 我有一个带有和对象的。每次调用,我都会执行以下操作: 我不关闭,因为没有关闭方法。每次调用servlet时,mongo中使用的连接数都会增加: 什么是与mongo和morphia建立联系的正确方式?这种联系到底在哪里?谢谢

    • 问题内容: 我在使用Spring使用凭据访问MongoDB时遇到问题。虽然没有凭据,但它就像一个咒语,但是使用它们却无法说 一定是由于新的auth默认设置,您可以在http://docs.mongodb.org/manual/core/authentication/中进行阅读 在3.0版中进行了更改:SCRAM-SHA-1是从3.0系列开始的MongoDB版本的默认机制。 问题: 有人找到一种使用

    • 问题内容: 我正在尝试从Java连接到Hive服务器1。很久以前我在这个论坛上发现了一个问题,但这对我不起作用。我正在使用此代码: 这就是指南中显示的代码。我已经在.java的同一路径中复制了hive- metastore,service,jdbc,exec,core和更多.jar。当我编译它时,我得到以下消息: 有人知道这里发生了什么吗? 问题答案: 尝试 代替 希望您在代码中添加了语句

    • 问题内容: 我正在使用Weblogic,Ejb3.0。Java 1.6 我需要通过Java代码访问Active Directory。我读了几种方法(Kerberos,LDAP) 有人可以建议我这样做的舒适​​方式吗?在哪里可以找到一些完整的代码示例, 谢谢,雷。 问题答案: 这是一个简单的代码,用于在W2K3上的JNDI中进行身份验证并进行LDAP搜索:

    • 我无法连接到我的。这是代码: 我得到了这个信息: 在学校,这个例子是有效的。问题出在哪里??