皆さん、最初に、HttpServer の組み込みに関する applicationContext.xml の部分を示します。そして、solr.properties から construcotr 引数を読み取ります。
<!-- solr configuration-->
<bean id="solrHttpServer" class="com.augmentum.ksp.solr.server.SolrHttpServer" scope="prototype">
<constructor-arg value="${solr.url}" />
<constructor-arg value="${solr.socketTimeOut}" />
<constructor-arg value="${solr.connTimeOut}" />
<constructor-arg value="${solr.maxConnDefault}" />
<constructor-arg value="${solr.maxConnTotal}" />
<constructor-arg value="${solr.maxRetries}" />
<constructor-arg value="${solr.allowCompression}" />
<constructor-arg value="${solr.followRedirects}" />
</bean>
そして、以下はDAOレイヤーのクエリメソッドです。サービスレイヤーの多くのメソッドが同時に「queryCount」メソッドを使用しています。
@Repository
public class SolrBaseDaoImpl implements SolrBaseDao {
@Autowired
private SolrHttpServer solrHttpServer;
@Override
public synchronized int queryCount(String coreName, String queryExpression, Set<String> filterQuerys)
throws SolrServerException, IOException {
if (null == queryExpression || "".equals(queryExpression)) {
return 0;
}
String baseUrl = SolrUtil.getSolrBaseURL(solrHttpServer.getBaseURL());
solrHttpServer.setBaseURL(baseUrl + "/" + coreName);
SolrQuery query = new SolrQuery();
query.setQuery(queryExpression);
// set filter query
if (null != filterQuerys) {
for (String fq : filterQuerys) {
query.addFilterQuery(fq);
}
}
query.setStart(0);
query.setRows(Integer.MAX_VALUE);
QueryResponse rsp = solrHttpServer.query(query);
return rsp.getResults().size();
}
}
このように、問題が発生しました。「SolrRemoteException:undefined field *」と報告。エラーの原因は、「queryCount」メソッドへの同時アクセスリクエストが多かったことだと考えており、メソッドに「同期」デコレータを追加し、問題が発生しなくなりました。しかし、ご存知のように、大量のリクエストがメソッドに 1 つずつアクセスすると、パフォーマンスが非常に遅くなります。それはひどいです!問題に対するあなたの思いを教えていただけますか?またはエラーはスレッド同期が原因ではないですか?</p>