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));
}
}

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

  1. 学习Spring(二) 调用静态工厂方法创建Bean

    1,创建抽象的产品类 package com.robert.spring.shop; public abstract class Product { } 2,创建具体产品类 package com.r ...

  2. Java - 用静态工厂方法代替构造器

    Effective Item - 考虑用静态工厂方法代替构造器我们有两种常见的方法获得一个类的实例: 公有的构造器 提供静态工厂方法(static factory method) 相对公有的构造器,静 ...

  3. Spring学习--静态工厂方法、实例工厂方法创建 Bean

    通过调用静态工厂方法创建 bean: 调用静态工厂方法创建 bean 是将对象创建的过程封装到静态方法中 , 当客户端需要对象时 , 只需要简单地调用静态方法 , 而不需要关心创建对象的细节. 要声明 ...

  4. 创建对象_工厂方法(Factory Method)模式 与 静态工厂方法

      工厂方法模式:   定义:为创建对象定义一个接口,让子类决定实例化哪个类.工厂方法让一个类的实例化延迟至子类.   应用场景: 客户类不关心使用哪个具体类,只关心该接口所提供的功能: 创建过程比较 ...

  5. 静态工厂方法和实例工厂方法及普通的bean

    容纳你的bean  bean工厂:最简单的容器,提供了基础的依赖注入支持.创建各种类型的Bean.  应用上下文(ApplicationContext):建立在bean工厂基础之上,提供系统架构服务. ...

  6. [原创]java WEB学习笔记102:Spring学习---Spring Bean配置:bean配置方式(工厂方法(静态工厂方法 & 实例工厂方法)、FactoryBean) 全类名

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

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

    通过调用静态工厂方法创建Bean 1)调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中.当客户端需要对象时,只需要简单地调用静态方法,而不需要关心创建对象的具体细节. 2)要声明通过静态 ...

  8. Spring 工厂方法创建Bean 学习(三)

    1, 静态工厂方法创建Bean 调用静态工厂方法创建 Bean是将对象创建的过程封装到静态方法中. 当客户端需要对象时, 只需要简单地调用静态方法, 而不同关心创建对象的细节. 要声明通过静态方法创建 ...

  9. <创建和销毁对象>经验法则——考虑用静态工厂方法代替公有构造方法

    一.引出静态工厂方法 对于java类而言,为了让使用者获取它自身的一个实例化对象,会有以下方法: 1.该类提供一个公有的构造方法.在这种情况下,程序可以通过多个“new 构造方法”语句来创建类的任意多 ...

随机推荐

  1. Python输入输出(IO)

    程序会有输入和输出,输入可以从标准输入或是从一个文件读入数据,程序的输出可以以一种友好可读的方式(human-readable)打印出来,或是写进一个文件,而标准输入和标准输出(键盘和显示器)在程序的 ...

  2. HDU 5776 sum (前缀和)

    题意:给定 n 个数,和 m,问你是不是存在连续的数和是m的倍数. 析:考虑前缀和,如果有两个前缀和取模m相等,那么就是相等的,一定要注意,如果取模为0,就是真的,不要忘记了,我当时就没记得.... ...

  3. hdoj 5373 The shortest problem

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5373 一开始想到用整除11的性质去做,即奇位数的和和偶位数的和的差为11的倍数,但估不准数据范围没敢去 ...

  4. VTK序列图像的读取[转][改]

    医学图像处理的应用程序中,经常会碰到读取一个序列图像的操作.比如CT.MR等所成的图像都是一个切面一个切面地存储的,医学图像处理程序要处理这些数据,第一步当然是把这些数据从磁盘等外部存储介质中导入内存 ...

  5. spring4 定时任务

    一.spring 定时任务 spring 定时任务 ,最好使用quartz 实现.下面我以spring4为例 二.实战(默认) 1.pom配置 <!-- spring time task --& ...

  6. mvvm架构使用解析

    配置 android studio目前已经集成了dataBinding,只需在build.gradle中配置,如下: android { dataBinding { enabled = true; } ...

  7. codechef Jewels and Stones 题解

    Soma is a fashionable girl. She absolutely loves shiny stones that she can put on as jewellery acces ...

  8. CodeForces 163B Lemmings 二分

    Lemmings 题目连接: http://codeforces.com/contest/163/problem/B Descriptionww.co As you know, lemmings li ...

  9. Codeforces Round #309 (Div. 2) C. Kyoya and Colored Balls 排列组合

    C. Kyoya and Colored Balls Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contes ...

  10. ztree使用系列四(ztree实现同级拖拽排序并将排序结果保存数据库)

    ztree这个系列的最后一篇,也是ztree功能强大的体现之中的一个--排序功能. ztree能够实现全部节点之间任意的拖拽排序功能.我这里依据须要实现了仅仅同意同级之间任意拖拽排序,事实上原理都一样 ...