为了测试基础,我试图在15分钟内创建3万个特定于文档的文档。
在测试过程中,创建了6563个文档,然后将其挂起。我已经看到创建0到3K千花了2分钟;在3K-6K之间创建5分钟; 5分钟即可创建最终的6K -6.5K文档。
示例here。
希望能帮助您了解我在做什么错。代码如下:
public class ConnectionManager {
Logger logger = Logger.getLogger(getClass().getName());
private CouchbaseClient client;
public ConnectionManager() {
init();
}
public void init() {
try {
logger.info("Opening base connection.");
List<URI> hosts = Arrays.asList(new URI("http://127.0.0.1:8091/pools"));
String bucket = "default";
String password = "";
client = new CouchbaseClient(hosts, bucket, password);
} catch (Exception e) {
client = null;
throw new IllegalStateException(e);
}
}
@PreDestroy
public void destroy() {
logger.info("Closing base connection.");
if (client != null) {
client.shutdown();
client = null;
}
}
public CouchbaseClient getClient() {
return client;
}
}
public class DatabaseManager {
ConnectionManager cm;
public DatabaseManager() {
cm = new ConnectionManager();
}
public String addDocument(String result) {
CouchbaseClient c = cm.getClient();
JSONParameters j = new JSONParameters();
String id = UUID.randomUUID().toString();
Date today = new Date();
SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss.SSSZ");
String date = DATE_FORMAT.format(today);
j.setTime(date);
j.setData(UUID.randomUUID().toString());
j.setSender_id(result);
j.setFlag(false);
Gson gson = new Gson();
String json = gson.toJson(j);
c.add(result, json);
return json;
}
public class DataBaseAddServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
for (int k = 0; k < 30000; k++) {
String id = UUID.randomUUID().toString();
DatabaseManager dbManager = new DatabaseManager();
dbManager.addDocument(id);
}
} catch (Exception e) {
resp.getOutputStream().println(e.getMessage());
resp.flushBuffer();
}
}
}
最佳答案
我认为您错过了所链接示例的关键点:在Servlet中,通过依赖项注入来注入DatabaseManager,因此仅创建了一个实例。
在代码中,您实际上在循环内创建了一个新的DatabaseManager,因此最终创建了30K CouchbaseClients。您可能会达到极限,并且肯定会浪费大量的时间和资源来吸引更多的客户。
仅在for循环之前移动DatabaseManager dbManager = new DatabaseManager();
应该会使情况变得更好。