为了测试基础,我试图在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();应该会使情况变得更好。

08-26 02:20