通过 Jongo 驱动程序、Java MongoDB 驱动程序和 MongoRepository 之间的负载测试比较保存方法

Comparing save methods through load test between Jongo driver, Java MongoDB driver and MongoRepository

在我的毕业论文中,我为客户端和数据库之间的 select/save 操作开发了 REST API。数据将从传感器 post 作为 JSON 存储在 MongoDB 中。我们选择了三种不同的存储技术:Jongo 驱动程序 1.3.0、Java MongoDB 驱动程序 3.4.0 和来自 Spring 的 MongoRepository(使用 Jackson FasterXML)。实施后,我们开始通过 JMeter 进行负载测试。测试用例有这些参数:

线程 - 100、250、500、1000

加速期 - 10 秒

循环次数 - 30

我们假设驱动程序会比 MongoRepository 更有效,但在 1000 个线程的情况下,MongoRepository 每秒加载 400 个请求,驱动程序无法处理所有请求。所以MongoRepository可以快速快速存储。谁能说说为什么 MongoRepository 更有效?

编辑:

MongoRepository 看起来像这样:

@Repository
public interface EndPointsMongoRepository extends 
MongoRepository<EndPointsDataControllerEntity, String> {
}

方法将 json 反序列化为实体:

    private EndPointsDataControllerEntity parseDataFromJson(String json) {

    ObjectMapper mapper = new ObjectMapper();
    EndPointsDataControllerEntity controller = null;
    try {
        controller = mapper.readValue(json, EndPointsDataControllerEntity.class);
    } catch(JsonParseException ex){
        LOGGER.warn(" JsonParseException with message :" + ex.getMessage());
    } catch(JsonMappingException ex){
        LOGGER.warn("JsonMappingException with message :" + ex.getMessage());
    } catch(IOException ex){
        LOGGER.warn("IOException with message :" + ex.getMessage());
    }
    LOGGER.info("Id controller: " + controller.getIdController());
    return controller;
}

那我只存数据

Java MongoDB 驱动实现:

public void saveUnstructuredMeasuredData(String json) {

    LOGGER.info("Data saved to database by second way: \n" + json);
    com.mongodb.client.MongoCollection<Document> collection = getMongoClient().getCollection(UNSTRUCTURED_DATA);
    Document objectFromJson = Document.parse(json);

    objectFromJson.put(TIMESTAMP_MEASURE, createTimeMeasureAsTimestamp(objectFromJson));

    collection.insertOne(objectFromJson);
}

和钟戈:

public void saveUnstructuredMeasuredDataStraightWithShell(String json) {

    LOGGER.info("Data saved to database by third way: \n" + json);
    Jongo jongo = new Jongo(getMongoDB());

    MongoCollection measuredData = jongo.getCollection(MEASURED_DATA);
    measuredData.insert(json);
}

Jongo 不是驱动程序,它使用一个。 基本上,您接下来提到的那个 - 即 "official" 驱动程序。 第三个甚至是接口,它有两个不同的实现 - 哪个是你的?

所以,你看,你刚刚制造了一些概念上的混乱。要回答您的问题,您需要了解每个案例的实施细节。

我可以假设,作为企业级且相当成熟的框架,Spring 具有更高效的并发实现,带有 connection/worker 池或类似的东西。