2

我是 ektorp 和 spring 的新手。所以请不要向我扔石头:)。我们已有用 php/couchdb 编写的应用程序,现在将其移动到 java/spring/couchdb。我已经按照文档如何配置和编写代码。当我运行 junit 测试代码工作正常,但在登台环境(Debian)中我看到套接字没有释放,这最终导致打开文件过多错误。DBConnection 对象被注释为存储库。我没有使用 ektorp spring,也没有通过 context.xml 配置 ektorp

这是配置的代码

private StdCouchDbConnector couchDbConnectior;

public CouchDbConnector getConnection() {
        if (null != couchDbConnectior) {
            return couchDbConnectior;
        } else {
            return createConnection();
        }
}

private CouchDbConnector createConnection() {
        StdCouchDbInstance dbInstance = null;
        if (null != host || !host.equalsIgnoreCase("null")) {
            try {
                HttpClient httpClient = new StdHttpClient.Builder()
                        .url(host)
                        .port(new Integer(port))
                        .username(key1)
                        .password(key2)
                        .maxConnections(new Integer(maxConnections))
                        .connectionTimeout(100000)
                        .socketTimeout(100000)
                        .cleanupIdleConnections(true)
                        .build();
                dbInstance = new StdCouchDbInstance(httpClient);
            } catch (MalformedURLException ex) {
                log.error("Cannot create CouchDB connection", ex);
            }
        }
        if (null != dbInstance) {
            return dbInstance.createConnector(dataBaseName, false);
        } else {
            return null;
        }
    }

正如我之前提到的,连接本身工作正常。问题是,当我在阶段环境中的 tomcat 中运行代码时,套接字未释放,我看到许多打开的套接字连接状态为 CLOSE_WAIT,我知道它们被卡住了,因为进程在午夜运行,我在上午 11 点检查了系统。这是我在运行 lsof connand 时看到的

java 604 根 44u IPv6 53620 0t0 TCP ip_of_couch_db (CLOSE_WAIT)

任何帮助将不胜感激。

4

0 回答 0