HttpSolrServer-采用静态工厂方法,创建HttpSolrServer单实例

  HttpSolrServer线程安全,如果使用下面构造器,必须对所有的请求重用相同的实例.如果实例在运行中创建的,它可能会导致连接泄漏.推荐的做法就是保持每个solr服务url的HttpSolrServer的静态实例,所有的请求都共享这个实例.参考https://issues.apache.org/jira/browse/SOLR-861查看更多细节.1.创建配置文件solr-config.properties:
cores=ac,jd

base_url=http://127.0.0.a:13131/solr

 2.创建配置对象ConfigUtil.java 读取properties文件中的配置:

package com.li.util;

import java.util.ResourceBundle;

public class ConfigUtil {
    private static ResourceBundle  resouceBundle = ResourceBundle.getBundle(Config.SEARCH);
    public static String getString(String key){
        return resouceBundle.getString(key);
    }
}

3.配置属性对象类Config.java:

package com.li.util;

public class Config {

    //common
    public static final String COMMA = ",";
    public static final String UNDERLINE = "_";
    public static final String SINGE_BLANK =" ";
    public static final String SLASH ="/";
    public static final String COLON =":";

    public static final String BASE_URL = "base_url";
    public static final String CORES = "cores";

    //配置文件
    public static final String SEARCH = "solr-config";

}

4.静态工厂方法SolrServerFactory.java:

package com.li.solrj;

import java.util.HashMap;
import java.util.Map;

import org.apache.solr.client.solrj.impl.HttpSolrServer;

import com.li.util.Config;
import com.li.util.ConfigUtil;

/**
 * 创建一个HttpSolrServer的静态工厂方法,
 * 用于创建多个集合的单例模式
 * @author Administrator
 *
 */
public class SolrServerFactory {

    public static Map<String,HttpSolrServer> servers ;

    static {
        servers = new HashMap<String,HttpSolrServer>();
        //静态加载所有的solrServer
        String[] cores = ConfigUtil.getString(Config.CORES).split(Config.COMMA);
        String base_url = ConfigUtil.getString(Config.BASE_URL);
        for(String core : cores){
            String url ;
            if(base_url.endsWith(Config.SLASH)){
                url = base_url + core;
            }else{
                url = base_url+Config.SLASH+core;
            }
            HttpSolrServer server = new HttpSolrServer(url);
            servers.put(core, server);
        }
    }
    public HttpSolrServer newInstance(String collection){
        if(servers.containsKey(collection))
            return servers.get(collection);
        String base_url = ConfigUtil.getString(Config.BASE_URL);
        if(base_url.endsWith(Config.SLASH))
            base_url = base_url+collection;
        else
            base_url = base_url + Config.SLASH + collection;
        return servers.put(collection, new HttpSolrServer(base_url));
    }
}
时间: 2024-11-12 16:20:13

HttpSolrServer-采用静态工厂方法,创建HttpSolrServer单实例的相关文章

考虑用静态工厂方法替代构造器的情况

考虑用静态工厂方法替代构造器 原来创建一个自定义类的实例最常用的方法是采用构造器,但一个类可以有多个构造器,而所有的构造器名字都相同,我们只能通过参数来区分不同构造器的作用.除了采用构造器外,还可以采用静态工厂方法,该方法返回类的实例便可,自定义的方法可以自己命名,这样一来就很容易区分每个方法的作用了. 例子: publicclass CreateObject { intage; String name; public CreateObject(String name){ this.name =

考虑使用静态工厂方法替代构造方法

创建对象 构造方法创建对象 在Java中,创建对象常用的方法是通过公有构造方法创建: 举个例子:如下,是Boolean类的一个构造方法,以及通过该构造方法创建一个Boolean对象: public Boolean(String s) { this(toBoolean(s)); } Boolean bTrue = new Boolean("true"); 静态工厂方法创建对象 其实,创建对象还有另外一种方法,通过公有静态工厂方法来创建对象,不过这种方法往往容易被程序员忽略: 举个例子,如

Spring(十三):使用工厂方法来配置Bean的两种方式(静态工厂方法&amp;实例工厂方法)

通过调用静态工厂方法创建Bean 1)调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中.当客户端需要对象时,只需要简单地调用静态方法,而不需要关心创建对象的具体细节. 2)要声明通过静态方法创建的Bean,需要在Bean的class属性中指定拥有该工厂的方法的类,同时需要在bean的factory-method属性里指定工厂方法的名称.最后,使用<constructor-arg>元素为该方法传递方法参数. 示例: 第一步:创建一个java project,导入包: 第二步:创建c

&lt;创建和销毁对象&gt;经验法则——考虑用静态工厂方法代替公有构造方法

一.引出静态工厂方法 对于java类而言,为了让使用者获取它自身的一个实例化对象,会有以下方法: 1.该类提供一个公有的构造方法.在这种情况下,程序可以通过多个“new 构造方法”语句来创建类的任意多个实例.但是每执行一条new语句,都会导致java虚拟机的堆区中产生一个新的对象. 2.该类提供一个公有的静态工厂方法(它只是一个简单的静态方法,返回的是类的一个实例,要区别于设计模式中的工厂方法模式).对于某些java平台库类或自己的工具类.参数化类,需要进一步封装创建自身实例的细节,并且控制自身

第二章、创建和销毁对象。ITEM1:考虑用静态工厂方法代替构造器

除了使用构造器来获取类的一个实例,还可以使用静态工厂方法(static factory method). 下面的方法是将boolean基本类型转成一个Boolean对象引用: 1 public final class Boolean implements java.io.Serializable, 2 Comparable<Boolean> 3 { 4 //与基本类型boolean=true匹配 5 public static final Boolean TRUE = new Boolean(

创建和销毁对象——用静态工厂方法代替构造器

参考资料:<Effective Java>,https://www.jianshu.com/p/ceb5ec8f1174. 基础回顾 1.什么是构造器? 构造器与类同名,在新建一个类的对象时,构造器会运行,以便将实例初始化为所希望的状态. 每个类都会有一个默认的无参的构造器.也可以自己手动写一个构造器. 如,在People类中写一个构造器: public People(String Name,int Age) { this.Name=Name; this.Age=Age; } 然后新建一个关于

经验法则:考虑用静态工厂方法代替公有构造方法

经验法则:考虑用静态工厂方法代替公有构造方法 一.引出静态工厂方法 对于java类而言,为了让使用者获取它自身的一个实例化对象,会有以下方法: 1.该类提供一个公有的构造方法.在这种情况下,程序可以通过多个“new 构造方法”语句来创建类的任意多个实例.但是每执行一条new语句,都会导致java虚拟机的堆区中产生一个新的对象. 2.该类提供一个公有的静态工厂方法(它只是一个简单的静态方法,返回的是类的一个实例,要区别于设计模式中的工厂方法模式).对于某些java平台库类或自己的工具类.参数化类,

Think in Java 静态工厂方法学习总结

静态工厂方法是一个返回类实例的静态方法.静态工厂方法的用于替代构造方法. 1.静态工厂方法的优点 如果一个构造方法的参数没有具体描述要返回的对象,那么使用一定意义名字的静态工厂方法使得该类更利于使用. 如果一个类有多个特征相同的构造方法,那么应该考虑用有特殊意义名字的静态工厂方法来代替构造方法. 静态工厂方法在调用的时候不要求一定要有类对象.对于一个非可变类,可以使用一个预先构造好的实例,或者实例已经缓存起来,避免创建重复对象. 静态工厂方法可以为重复的调用返回同一个对象.第一他可以使一个类确保

第一条:考虑使用静态工厂方法代替构造器

使用静态工厂方法代替构造器的几大优势: 静态工厂方法具有名称. 可以通过它的名称来判断它返回的实例的大概信息. 不必再每次调用时都创建一个新的实例.  例如单例类就使用了静态工厂方法. 静态工厂方法可以返回原返回类型的任何子类型的对象实例.   如返回类型是Service,可以返回Service类型的任何子类型 在创建参数化类型的实例时,静态工厂方法使代码变得更加简洁. 静态工厂方法的一些惯用名称: valueOf    该方法返回的实例与它的参数具有相同的值.它实际上时做类型转化的. of