1

数百のプールを使用している場合でも、solrServer クライアントの接続プールですぐに接続が不足するという問題があります (適切な測定のために 1024 を試しました)。

私が読んだことから、シングルトン HttpSolrServer オブジェクトを使用しないと、次の例外が発生する可能性があります。ただし、以下の XML 構成も参照してください。

Caused by: org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool
        at org.apache.http.impl.conn.PoolingClientConnectionManager.leaseConnection(PoolingClientConnectionManager.java:232)
        at org.apache.http.impl.conn.PoolingClientConnectionManager$1.getConnection(PoolingClientConnectionManager.java:199)
        at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:455)
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784)
        at org.apache.solr.client.solrj.impl.HttpSolrServer.executeMethod(HttpSolrServer.java:448)

XML 構成:

<solr:solr-server id="solrServer" url="http://solr.url.domain/"/>
<solr:repositories base-package="de.ourpackage.data.solr" multicore-support="true"/>

この時点で、私たちは途方に暮れています。Tomcat7 で Web アプリケーションを実行しています。ユーザーが新しい Web サイトを要求するたびに、Solr サーバーに 1 つ以上の要求を送信し、必要なものを要求します。これは通常、単一のエントリまたは 20 のページ (Spring Data を使用) です。

実装の残りの部分については、各リポジトリ (コアごとに 1 つのリポジトリ) によって拡張される抽象 SolrOperationsrepository クラスを使用しています。

以下は、solrServer の設定方法です。ここで根本的に間違ったことをしているのではないかと思います。ログによると、それらは常にプールに返されています。

private SolrOperations solrOperations;

    @SuppressWarnings("unchecked")
    public final Class<T> getEntityClass() {
        return (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }

    public final SolrOperations getSolrOperations() {
        /*HttpSolrServer solrServer = (HttpSolrServer)solrOperations.getSolrServer();
        solrServer.getHttpClient().getConnectionManager().closeIdleConnections(500, TimeUnit.MILLISECONDS);*/
        logger.info("solrOperations: " + solrOperations);
        return solrOperations;
    }

    @Autowired
    public final void setSolrServer(SolrServer solrServer) {
        try {
            String core = SolrServerUtils.resolveSolrCoreName(getEntityClass());
            SolrTemplate template = templateHolder.get(core);
            /*solrServer.setConnectionTimeout(500);
            solrServer.setMaxTotalConnections(2048);
            solrServer.setDefaultMaxConnectionsPerHost(2048);
            solrServer.getHttpClient().getConnectionManager().closeIdleConnections(500, TimeUnit.MILLISECONDS);*/

            if ( template == null ) {
                template = new SolrTemplate(new MulticoreSolrServerFactory(solrServer));
                template.setSolrCore(core);
                template.afterPropertiesSet();

                logger.debug("Creating new SolrTemplate for core '" + core + "'");
                templateHolder.put(core, template);
            }
            logger.debug("setting SolrServer " + template);

            this.solrOperations = template;
        } catch (Exception e) {
            logger.error("cannot set solrServer...", e);
        }
    }

コメントアウトされたコードは、主にテスト目的で使用されています。また、solrServerオブジェクトをオンザフライで操作できないこともどこかで読みました。XML構成でタイムアウト/プールサイズを設定するにはどうすればよいですか?

リポジトリの実装は次のようになります。

@Repository(value="stellenanzeigenSolrRepository")
public class StellenanzeigenSolrRepositoryImpl extends SolrOperationsRepository<Stellenanzeige> implements StellenanzeigenSolrRepositoryCustom {
...
    public Query createQuery(Criteria criteria, Sort sort, Pageable pageable) {
        Query resultQuery = new SimpleQuery(criteria);
        if ( pageable != null ) resultQuery.setPageRequest(pageable);
        if ( sort != null ) resultQuery.addSort(sort);
        return resultQuery;
    }

    public Page<Stellenanzeige> findBySearchtext(String searchtext, Pageable pageable) {
        Criteria searchtextCriteria = createSearchtextCriteria(searchtext);
        Query query = createQuery(searchtextCriteria, null, pageable);
        return getSolrOperations().queryForPage(query, getEntityClass());
    }
...
}

この問題につながる可能性のある、私たちが犯した過ちを指摘できる人はいますか? 私が言ったように、私たちは途方に暮れています。事前に感謝します。もちろん、私たちが進歩したり、より多くの情報を要求したりすると、質問を更新します.

4

1 に答える 1