一种高性能的HttpSolrServer实例创建

来源:互联网 发布:excel2003 sql 编辑:程序博客网 时间:2024/05/19 01:14

solrj客户端段的httpserver的实例需要使用同一个HttpSolrServer实例,那么容易想到之前的单例模式。

单例模式见-->单例模式详解

实际使用中http方式连接的solrserver可能被经常调用,那么就存在并发和性能问题。如果应用场景的要求不高,那么简单的确保一个实例就可以满足要求。如果遇到多线程调用的查询接口那么需要确get server实例的同步,如果还存在频繁的调取查询,那么性能上还的保证此同步方法的高效率,从减少同步方法的判断次数来提高效率。看看如下的一种获取HttpSolrServer的创建方法:

public class SolrServerClient {    private String SOLR_ADMIN_URL = "http://localhost:8983/solr/";    private static HttpSolrServer server = null;    private volatile static SolrServerClient solrServiceClient = null;    private SolrServerClient() {        this.getServer();    }    /**     * SolrServerClient 是线程安全的 需要采用单例模式     * 此处实现方法适用于高频率调用查询     *     * @return SolrServerClient     */    public static SolrServerClient getInstance() {        if (solrServiceClient == null) {            synchronized (SolrServerClient.class) {                if (solrServiceClient == null) {                    solrServiceClient = new SolrServerClient();                }            }        }        return solrServiceClient;    }    /**     * 初始化的HttpSolrServer 对象,并获取此唯一对象     * 配置按需调整     * @return 此server对象     */    private HttpSolrServer getServer() {        if (server == null) {            server = new HttpSolrServer(SOLR_ADMIN_URL);            server.setConnectionTimeout(3000);            server.setDefaultMaxConnectionsPerHost(100);            server.setMaxTotalConnections(100);        }        return server;    }}

分析:getServer是获取HttpSolrServer实例,SolrServerClient是单例模式中需要创建的实例,确保这个实例唯一,那么获取到的server就是同一对象,getInstance方法使用了一个双重加锁的方法返回对象实例,仅仅在首次创建的时候会进行同步方法的判断,以后获取实例同步块不执行。

volatile修饰单例的实例,确保在多线程下 此对象不同被被修,去判断是否为null时候可以得到正确的状态。



原创粉丝点击