大家好,初学elasticsearch使用版本为1.7.0,java程序每次获取client平均需要3S,这样用搜索的意义就没有了。
看了看网上的帖子说client做成单例模式,每次不关闭client,可是做成单例模式不关闭client,es的控制台会报错,但是client还可以继续使用。
请问大家有没有碰到类似的问题?
获取client代码如下:
private static final Log log = LogFactory.getLog(ElasticService.class);
private static Settings settings = ImmutableSettings.settingsBuilder().put("client.transport.ping_timeout", "10s").put("client.transport.sniff", "true").build();
private TransportClient searchClient = null;
public TransportClient getElasticClient() throws Exception{
/**
* 你可以设置client.transport.sniff为true来使客户端去嗅探整个集群的状态,
* 把集群中其它机器的ip地址加到客户端中,这样做的好处是一般你不用手动设置集群里所有集群的ip到连接客户端,
* 它会自动帮你添加,并且自动发现新加入集群的机器。
*/
try {
Class clazz = Class.forName(TransportClient.class.getName());
Constructor constructor = clazz.getDeclaredConstructor(new Class[] { Settings.class });
constructor.setAccessible(true);
searchClient = ((TransportClient) constructor.newInstance(new Object[] { settings }));
searchClient.addTransportAddress(new InetSocketTransportAddress("127.0.0.1", 9300));
return searchClient;
} catch (Exception e) {
log.error("elasticSearch Client init error :"+e);
throw new RuntimeException("elasticSearch Client init error", e);
}
}
请问大家是怎么做的?
就这么多分了····都贡献了。
求代码,求版本····
经研究发现,每次静态代码调用都是3000-6000毫秒,但是部署到服务器后发现只有第一次是这么长的时间,第二次调用后至以后都不会那么久 也不需要做成单例,每次获取,用完后关闭,不然es控制台会报错 ,报错如下:
[2016-04-09 14:11:00,457][WARN ][transport.netty ] [Cerebra] exception
caught on transport layer [[id: 0x79b52975, /192.168.1.101:56796 => /192.168.1.1
01:9300]], closing connection
获取时长如下:
获取client耗时:342
查询耗时:11
总共有数据:2
本次查询数据:2
{id=1, content=测试Content1, title=测试topicquery1, oper_time=1459328862145}
{id=2, content=测试Content2, title=测试topicquery2, oper_time=1459328865773}
获取client实例代码还是上面的代码如下:
public class ElasticService {
private static final Log log = LogFactory.getLog(ElasticService.class);
private static Settings settings = ImmutableSettings.settingsBuilder().put("client.transport.ping_timeout", "10s").put("client.transport.sniff", "true").build();
public static TransportClient getElasticClient() throws ElasticsearchException{
/**
* 你可以设置client.transport.sniff为true来使客户端去嗅探整个集群的状态,
* 把集群中其它机器的ip地址加到客户端中,这样做的好处是一般你不用手动设置集群里所有集群的ip到连接客户端,
* 它会自动帮你添加,并且自动发现新加入集群的机器。
*/
try {
Class clazz = Class.forName(TransportClient.class.getName());
Constructor constructor = clazz.getDeclaredConstructor(new Class[] { Settings.class });
constructor.setAccessible(true);
TransportClient searchClient = ((TransportClient) constructor.newInstance(new Object[] { settings }));
searchClient.addTransportAddress(new InetSocketTransportAddress("127.0.0.1", 9300));
return searchClient;
} catch (Exception e) {
log.error("elasticSearch Client init error :"+e);
throw new ElasticsearchException("elasticSearch Client init error", e);
}
}
}
private static TransportClient searchClient = null;
/**
* 获取ElaticSearchClient
*
* @author yanghao
* @throws Exception
*/
public static TransportClient getElasticClient() throws Exception {
if(searchClient == null){
synchronized (lock) {//防止高并发时创建多个查询对象
if (searchClient == null) {
searchClient = new ElasticService().getElasticClient();
}
}
}
return searchClient;
}
这是上层获取client代码。
大家获取es client是如何做的?请多多指教,谢谢。
import java.net.InetAddress;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.springframework.stereotype.Component;
/**
@version 创建时间:2017年9月17日 下午8:48:52 类说明
*/
@Component
public class SearchAction {
public SearchAction(){
getClient();
}
public static TransportClient client;
public static TransportClient getClient(){
if(null==client){
Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
// 创建client
try {
client = new PreBuiltTransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return client;
}
}
我是这么弄的,感觉方法有点笨