2014-01-20 3 views
19

나는 redis 서버에 대한 연결을 관리하기 위해 jedis 풀을 사용하고 있습니다. 내 예제 코드는 다음과 같이Jedis 풀은 어떻게 작동합니까?

public Set<String> getTopArticleList(int start, int end) { 
     Set<String> list = null; 
     Jedis j = JedisFactory.getInstance().getJedisPool().getResource(); 
     Pipeline pipe = j.pipelined(); 
     try { 
      // do stuff with redis 
      pipe.sync(); 
     } catch (JedisConnectionException jex) { 
      JedisFactory.getInstance().getJedisPool().returnBrokenResource(j); 
     } finally { 
      JedisFactory.getInstance().getJedisPool().returnResource(j); 
     } 

     return list; 
    } 

그리고 코드는 문제는 제한 연결 수에 도달 한 후, 웹이 더 이상 액세스 할 수 없다는 것입니다 jedis가

class JedisFactory { 
     private static JedisPool jedisPool; 
     public JedisFactory() { 
      JedisPoolConfig poolConfig = new JedisPoolConfig(); 
      jedisPool = new JedisPool(
       poolConfig, 
       RedisDBConfig.HOST, 
       RedisDBConfig.PORT, 
       RedisDBConfig.TIMEOUT, 
       RedisDBConfig.PASSWORD 
     ); 
     } 

     public JedisPool getJedisPool() { 
      return jedisPool; 
     } 

     public static JedisFactory getInstance() { 
      if (instance == null) { 
       instance = new JedisFactory(); 
      } 
      return instance; 
     } 

수영장 검색 할 수 있습니다. 내가 뭔가 잘못하고 있는거야?

+0

당신은 JedisFactory의 전체 코드를 추가 할 수 있습니까? 특히 getInstance() impl과 getJedisPool()? – zenbeni

+0

JedisFactory의 전체 코드를 추가했습니다. – ipkiss

+0

2 개 이상의 스레드를 사용합니까? 멀티 스레딩 문제 일 수 있습니까? – zenbeni

답변

26

는 당신은 풀의 maxTotal 크기를 구성하지 않은, 기본 값은 당신에 JedisFactory 생성자를 바꿀 수 만 8입니다 :


    public JedisFactory() { 
     JedisPoolConfig poolConfig = new JedisPoolConfig(); 
     poolConfig.setMaxTotal(128); 
     jedisPool = new JedisPool(poolConfig, RedisDBConfig.HOST, RedisDBConfig.PORT, RedisDBConfig.TIMEOUT, RedisDBConfig.PASSWORD); 
    } 

의 기본 가치도 조심 ExhaustedAction (WHEN_EXHAUSTED_BLOCK)은 원하는 동작이 아니므로주의하십시오.

Jedis

아파치 커먼즈 풀을 사용하며 여기에 매개 변수입니다에 대해 당신이 읽을 수 있습니다 GenericObjectPool

+1

JedisPoolConfig 매개 변수에 대해 언급 한 문서가 있습니까? 검색을 시도했지만 설명이없는 함수 api 목록 만 얻었습니다. 예를 들어, "WhenExhaustedAction"이하는 일을 알고 싶습니다. – ipkiss

+1

JedisPoolConfig에는 setMaxActive가 없습니다. 이것은 컴파일되지 않습니다. – JohnMerlino

+3

@ JohnMerlino 당신 말이 맞아요, Jedis의 최신 버전에서, 그들은 commons-pool을 버전 2.X로 바꿨습니다. 그래서 새로운 메소드는 setMaxTotal()이되었습니다. 곧 답변을 업데이트 할 것입니다. –