插入文档

时间:2015-04-30 08:52:47

标签: java apache-httpclient-4.x azure-cosmosdb

我一直在使用Azure DocumentDB几天,并在插入数据时遇到了奇怪的行为。 (我使用来自maven https://github.com/Azure/azure-documentdb-java的java sdk的1.0版本)

要在我的pojos上插入数据并尝试插入它们:

for (Order order : jsonImporter.getOrderList()) {
    Document doc = new Document(gson.toJson(order, Order.class));
    doc.setId(order.uuid);
    doc.set(TYPE, TYPE_ORDER);
    try {
        client.createDocument(getCollection().getSelfLink(), doc, null, true);
    } catch (DocumentClientException e) {
        System.err.printf("AzureDocumentDB - insertOrder request failed (order uuid %s)", order.uuid);
        System.err.println(e.getMessage());
    }
}

问题是,当我达到第100个元素(这是最大连接池大小)时,我得到一个例外,即我的连接池无法给我另一个连接。 我还尝试修改连接池的设置以增加连接数据并减少" IdleConnectionTimeout"尽早释放连接但没有成功。
例如,当我将池大小增加到500时,我在第500个元素之后得到了异常。

ConnectionPolicy connectionPolicy = new ConnectionPolicy();
connectionPolicy.setMaxPoolSize(500);
connectionPolicy.setIdleConnectionTimeout(10);
client = new DocumentClient(END_POINT, MASTER_KEY, connectionPolicy, ConsistencyLevel.Session);

有人在我的代码中看到API滥用吗?有人在插入数据时遇到过相同的行为吗?或者是在sdk或apache http客户端中是否存在已知错误导致连接未被释放?我很感激每一个帮助。

例外:

java.lang.IllegalStateException: Http client execution failed.
    at com.microsoft.azure.documentdb.GatewayProxy.performPostRequest(GatewayProxy.java:350)
    at com.microsoft.azure.documentdb.GatewayProxy.doCreate(GatewayProxy.java:90)
    at com.microsoft.azure.documentdb.DocumentClient.doCreate(DocumentClient.java:1968)
    at com.microsoft.azure.documentdb.DocumentClient.createDocument(DocumentClient.java:456)
    ...
Caused by: org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool
    at org.apache.http.impl.conn.PoolingClientConnectionManager.leaseConnection(PoolingClientConnectionManager.java:226)
    at org.apache.http.impl.conn.PoolingClientConnectionManager$1.getConnection(PoolingClientConnectionManager.java:195)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:423)
    at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57)
    at com.microsoft.azure.documentdb.GatewayProxy.performPostRequest(GatewayProxy.java:347)

1 个答案:

答案 0 :(得分:2)

您看到ConnectionPoolTimeoutException,因为在调用createXXXXXXXX()时,DocumentClient不会自动关闭流。此行为旨在支持createAttachment()的流式Blob附件。

要关闭流,您可以调用close()关闭流,或.getResource()返回资源,然后关闭流。

换句话说,请替换以下行:

client.createDocument(getCollection().getSelfLink(), doc, null, true);

使用:

client.createDocument(getCollection().getSelfLink(), doc, null, true).close();

或者:

doc = client.createDocument(getCollection().getSelfLink(), doc, null, true).getResource();