1

我正在尝试使用 mongoDB。我在 JSF 应用程序范围的 bean(使用 CDI)中创建。

@Named("appMongo")
@ApplicationScoped
public class MongoApplicationScope implements Serializable{

private static final long serialVersionUID = 1L;
private DB db = null;
private MongoClient mongoClient = null;

@PostConstruct
public void init() {
try {
    mongoClient = new MongoClient("localhost", 27017);
    db = mongoClient.getDB("mydb");
} catch (UnknownHostException e) {
    e.printStackTrace();
}
}

public DB getDb() {
return db;
}

public DBCollection getCollectionInDatabase(String collection) {
    DBCollection coll;
    coll = db.getCollection(collection);
    return coll;
}

public MongoClient getMongoClient() {
    return mongoClient;
}
}

然后我创建使用 prevoius bean 的请求范围 bean。

@Named("mongoBean")
@RequestScoped
public class MongoBean implements Serializable {

private static final long serialVersionUID = 1L;
@Inject MongoApplicationScope mongoAccess;
public void pringNumber() {
System.out.println(mongoAccess.getCollectionInDatabase("mydb").getCount());

}
}

在 xhtml 页面上,我有带有 actionListener 的 commandButton,它调用“printNumber”方法。结果是每个连接到 jboss 服务器并单击按钮打开与 mongo 的新连接的用户。我不想要那种情况。我想实现我只有 1 个连接 bettwen 服务器和数据库的情况,并且每个用户都重用该连接。

4

2 回答 2

1

MongoDB 驱动程序维护一个自己的连接池。连接不能也不应该在请求之间共享(想想也将共享的服务器端游标)。但是,连接将在交回池后被重用。在它们再次被使用之前,它们将在一段时间内保持活动状态,因为获取到数据库的新连接并不便宜。TCP 三向握手需要相当长的时间,因此保持连接打开确实有意义。事实上,在使用 RDBMS 时,您必须走一英里才能实现这种期望的行为,例如使用 C3p0 或 DBCP。

供您参考:您的连接池大小(以及您可能打开的与数据库服务器的连接数)应该至少是您的 servlet 引擎的执行线程数,这样就没有人必须等待其他请求完成之前甚至数据库连接可用(更不用说查询的数据)。对于一个成熟的应用程序服务器,我会添加另外 20-50 个连接,具体取决于配置。无论您是否使用 MongoDB,这都是要走的路。根据您的部署,这些是大约 200-550 个连接。

好的一面:

  1. MongoDB 连接在 RAM 方面非常轻量级。在客户端,我们谈论的是每个空闲连接几 KB,在服务器端分配了 1MB。
  2. 您可以配置驱动程序要使用的连接数。请注意,摆弄连接数量可能会对负载下的性能产生严重后果。有关详细信息,请参阅API 文档MongoClientOptions.Builder
  3. 驱动程序的默认值实际上在资源使用方面相当保守。例如,每个主机的最大连接数默认设置为 100,这对于任何严重的应用程序来说都有点低。

长话短说:除非遇到问题,否则切勿触摸正在运行的系统。

于 2014-10-28T20:38:02.317 回答
-1

请尝试更换

@Inject MongoApplicationScope mongoAccess;

@ManagedProperty(value = "#{appMongo}")
private MongoApplicationScope mongoAccess;

并为mongoAccess.

于 2013-05-09T07:48:45.267 回答