我已经使用ApacheJersey编写了一个RESTful API。我使用MongoDB作为后端。我使用Morphia(v.1.3.4)将POJO映射并持久化到数据库。我试着按照各地推荐的API中的“1应用1连接”,但我不确定我是否成功。我在Tomcat 8中运行API。我还运行了Mongostat查看了详细信息和连接。开始时,Mongostat显示了1个到MongoDB服务器的连接。我使用Postman测试了我的API,它运行良好。然后,我在SoapUI中创建了一个负载测试,模拟每秒100个用户。我在Mongostat上看到了更新。我看到有103个连接。下面是显示这种行为的gif。
我不确定为什么有这么多连接。有趣的事实是mongo连接的数量与我在SoapUI上创建的用户数量成正比。为什么?我发现了其他类似的问题,但我想我已经实施了那里的建议。
Mongo连接泄漏与吗啡
Spring data mongodb未关闭mongodb连接
我的代码是这样的。
数据库连接。JAVA
// Some imports
public class DatabaseConnection {
private static volatile MongoClient instance;
private static String cloudhost="localhost";
private DatabaseConnection() { }
public synchronized static MongoClient getMongoClient() {
if (instance == null ) {
synchronized (DatabaseConnection.class) {
if (instance == null) {
ServerAddress addr = new ServerAddress(cloudhost, 27017);
List<MongoCredential> credentialsList = new ArrayList<MongoCredential>();
MongoCredential credentia = MongoCredential.createCredential(
"test", "test", "test".toCharArray());
credentialsList.add(credentia);
instance = new MongoClient(addr, credentialsList);
}
}
}
return instance;
}
}
PourService。JAVA
@Secured
@Path("pours")
public class PourService {
final static Logger logger = Logger.getLogger(Pour.class);
private static final int POUR_SIZE = 30;
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response createPour(String request)
{
WebApiResponse response = new WebApiResponse();
Gson gson = new GsonBuilder().setDateFormat("dd/MM/yyyy HH:mm:ss").create();
String message = "Pour was not created.";
HashMap<String, Object> data = null;
try
{
Pour pour = gson.fromJson(request, Pour.class);
// Storing the pour to
PourRepository pourRepository = new PourRepository();
String id = pourRepository.createPour(pour);
data = new HashMap<String, Object>();
if ("" != id && null != id)
{
data.put("id", id);
message = "Pour was created successfully.";
logger.debug(message);
return response.build(true, message, data, 200);
}
logger.debug(message);
return response.build(false, message, data, 500);
}
catch (Exception e)
{
message = "Error while creating Pour.";
logger.error(message, e);
return response.build(false, message, new Object(),500);
}
}
倒ao.java
public class PourDao extends BasicDAO<Pour, String>{
public PourDao(Class<Pour> entityClass, Datastore ds) {
super(entityClass, ds);
}
}
Pourrespository。JAVA
public class PourRepository {
private PourDao pourDao;
final static Logger logger = Logger.getLogger(PourRepository.class);
public PourRepository ()
{
try
{
MongoClient mongoClient = DatabaseConnection.getMongoClient();
Datastore ds = new Morphia().map(Pour.class)
.createDatastore(mongoClient, "tilt45");
pourDao = new PourDao(Pour.class,ds);
}
catch (Exception e)
{
logger.error("Error while creating PourDao", e);
}
}
public String createPour (Pour pour)
{
try
{
return pourDao.save(pour).getId().toString();
}
catch (Exception e)
{
logger.error("Error while creating Pour.", e);
return null;
}
}
}
当我使用Mongo Morphia时,我使用数据存储的工厂模式而不是MongoClient获得了更好的结果,例如,检查以下类:
public DatastoreFactory(String dbHost, int dbPort, String dbName) {
final Morphia morphia = new Morphia();
MongoClientOptions.Builder options = MongoClientOptions.builder().socketKeepAlive(true);
morphia.getMapper().getOptions().setStoreEmpties(true);
final Datastore store = morphia.createDatastore(new MongoClient(new ServerAddress(dbHost, dbPort), options.build()), dbName);
store.ensureIndexes();
this.datastore = store;
}
使用这种方法,每次您需要数据存储时,您都可以使用工厂提供的数据存储。当然,如果您使用支持工厂模式的框架/库(例如:带有org.glassfish.hk2.api.Factory
的HK2),以及单例绑定,这可以实现得更好。
此外,您可以查看mongoclientations
的builder方法的文档,也许您可以在那里找到更好的连接控件。
问题内容: 下面的代码通过SSH在一台计算机上运行grep并打印结果: 我如何一次将5台机器全部置入grep(这样就不会造成重大延迟),而不是将所有这些都放入5个变量中并全部打印出来。 问题答案: 您需要将调用放在单独的线程(或进程中,但这可能会过大),这反过来又要求代码位于函数中(无论如何,这是一个好主意:模块的顶部没有大量代码水平)。 例如: If you had many more than
我正在开发Grails应用程序,目标是Grails Mongo插件。当我使用run-app命令在本地运行应用程序时,一切正常,应用程序打开了2个到Mongo实例的连接。 但是当我将应用程序打包到war文件并将其部署到远程Tomcat服务器时,启动应用程序的行为变得非常奇怪。 以下是启动日志: 所以,在启动过程中,应用程序尝试在单独的Java线程中获取MongoConnection,但失败了,但没有
我正在尝试从另一台机器创建与基于java的套接字服务器的多个客户端连接。服务器和客户端都使用Netty 4进行NIO。在服务器端,我使用了boss和Worker group,它能够在单个linux盒上接收和服务器100000并发连接(在设置内核参数和ulimited之后)。 但是,我最终在客户端为每个连接创建了一个新线程,这导致了JVM线程限制异常。 有人能告诉我,我如何使用Netty从客户端创建
我想创建一个类的实例,该类可以访问底层的嵌入式derby数据库,并使用声明性服务将该类传递给绑定到数据库包的每个包。 我在derby留档中看到,为多个线程共享一个连接有很多陷阱。所以我在考虑为我正在创建的类的每个实例创建一个连接。由于我只想要一种非常简单的方法来创建多个连接并管理它们,因此在这里使用“MiniConnectionPoolManager”似乎是一个不错的选择。derby的示例代码如下
问题内容: 我正在使用Redis通过Redis-py客户端库存储两个数据库:0和1 。我想为每个数据库创建两个连接。目前,我正在这样做: 但是,我似乎找不到从连接创建Redis对象的方法。 我在这里犯一个菜鸟错误吗? 问题答案: 您真的不应该那样创建连接。让我引用redis-py文档。 在后台,redis- py使用连接池来管理与Redis服务器的连接。默认情况下,您创建的每个Redis实例将依次
我正在使用现有的Java代码,其中在部署的系统上有一个现有的JDBC连接池机制,并且有一个已经存在的获取JDBC连接的设置。我想利用这一点来创建MyBatis SqlSession对象,而不创建配置、数据源和其他东西 我的代码已经创建了对象,并为其提供了所需的资源。我想利用这一点,获得对象,并从此使用MyBatis。 我不希望MyBatis管理连接池,确定使用哪个数据源等等,这可能吗?