Java Can';当我把它放在线绳上时,它不能成功地接近绝地

Java Can';当我把它放在线绳上时,它不能成功地接近绝地,java,multithreading,jedis,Java,Multithreading,Jedis,我只想在一个线程中保存一个绝地实例,所以我编写了一个引用HibernateSessionFactory的类 public class JedisFactory { private static final ThreadLocal<Jedis> threadLocal = new ThreadLocal<Jedis>(); private static JedisPool pool; static { try { Long timestampPr

我只想在一个线程中保存一个绝地实例,所以我编写了一个引用HibernateSessionFactory的类

public class JedisFactory {

private static final ThreadLocal<Jedis> threadLocal = new ThreadLocal<Jedis>();
private static JedisPool pool;

static {
    try {
        Long timestampPre = System.currentTimeMillis();
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxWaitMillis(Constants.REDIS_MAX_WAIT_MILLIS);
        config.setMinIdle(Constants.REDIS_MIN_IDLE);
        config.setMaxIdle(Constants.REDIS_MAX_IDLE);
        config.setMaxTotal(Constants.REDIS_MAX_ACTIVE);
        pool = new JedisPool(config, Constants.REDIS_ADDRESS, Constants.REDIS_PORT, Constants.REDIS_TIMEOUT);
        System.out.println("TEST createJedisPool: " + (System.currentTimeMillis() - timestampPre));
    } catch (Exception e) {
        System.err.println("%%%% Error Creating JedisFactory %%%%");
        e.printStackTrace();
    }
}

private JedisFactory() {
}

public static Jedis getJedis() throws JedisConnectionException {
    Jedis jedis = (Jedis) threadLocal.get();

    if (jedis == null) {
        if (pool == null) {
            rebuildJedisPool();
        }
        jedis = (pool != null)
                ? pool.getResource()
                : null;

        if (jedis != null) jedis.auth(Constants.REDIS_AUTH);
        threadLocal.set(jedis);
    }

    if (!jedis.isConnected()) {
        System.out.println(System.currentTimeMillis() + "open jedis");
        jedis.connect();
    }

    return jedis;
}

/**
 *  Rebuild jedis factory
 *
 */
public static void rebuildJedisPool() {
    try {
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxWaitMillis(Constants.REDIS_MAX_WAIT_MILLIS);
        config.setMinIdle(Constants.REDIS_MIN_IDLE);
        config.setMaxIdle(Constants.REDIS_MAX_IDLE);
        config.setMaxTotal(Constants.REDIS_MAX_ACTIVE);
        // 创建连接池
        pool = new JedisPool(config, Constants.REDIS_ADDRESS, Constants.REDIS_PORT, Constants.REDIS_TIMEOUT);
    } catch (Exception e) {
        System.err.println("%%%% Error Creating JedisFactory %%%%");
        e.printStackTrace();
    }
}

/**
 *  Close the single jedis instance.
 *
 */
public static void closeJedis() {
    Jedis jedis = (Jedis) threadLocal.get();
    threadLocal.set(null);

    if (jedis != null) {
        jedis.close();
    }
}
}
公共类工厂{
私有静态final ThreadLocal ThreadLocal=新ThreadLocal();
专用静态池;
静止的{
试一试{
Long timestampPre=System.currentTimeMillis();
JedisPoolConfig=新的JedisPoolConfig();
config.setMaxWaitMillis(Constants.REDIS_MAX_WAIT_MILLIS);
config.setMinIdle(Constants.REDIS\u MIN\u IDLE);
config.setMaxIdle(Constants.REDIS\u MAX\u IDLE);
config.setMaxTotal(Constants.REDIS\u MAX\u ACTIVE);
pool=new-JedisPool(配置,Constants.REDIS_地址,Constants.REDIS_端口,Constants.REDIS_超时);
System.out.println(“testcreatejedispool:”+(System.currentTimeMillis()-timestampPre));
}捕获(例外e){
System.err.println(“%%创建绝地工厂时出错%%”);
e、 printStackTrace();
}
}
私人工厂{
}
public static Jedis getJedis()抛出JedisConnectionException{
绝地武士=(绝地武士)threadLocal.get();
如果(绝地==null){
如果(池==null){
重建edispool();
}
绝地=(池!=空)
?pool.getResource()
:null;
if(jedis!=null)jedis.auth(Constants.REDIS_auth);
threadLocal.set(绝地武士);
}
如果(!jedis.isConnected()){
System.out.println(System.currentTimeMillis()+“开放绝地”);
绝地武士。连接();
}
返回绝地;
}
/**
*重建绝地工厂
*
*/
publicstaticvoid重建edispool(){
试一试{
JedisPoolConfig=新的JedisPoolConfig();
config.setMaxWaitMillis(Constants.REDIS_MAX_WAIT_MILLIS);
config.setMinIdle(Constants.REDIS\u MIN\u IDLE);
config.setMaxIdle(Constants.REDIS\u MAX\u IDLE);
config.setMaxTotal(Constants.REDIS\u MAX\u ACTIVE);
// 创建连接池
pool=new-JedisPool(配置,Constants.REDIS_地址,Constants.REDIS_端口,Constants.REDIS_超时);
}捕获(例外e){
System.err.println(“%%创建绝地工厂时出错%%”);
e、 printStackTrace();
}
}
/**
*关闭单个绝地实例。
*
*/
公共静态空间关闭器(){
绝地武士=(绝地武士)threadLocal.get();
threadLocal.set(null);
如果(绝地武士!=空){
绝地武士。接近();
}
}
}
它确实将一个绝地实例保存在一个线程中并正常工作,但当我想通过调用closeJedis()来克隆绝地时,它会抛出异常。 以下是异常信息:

[详细信息]redis.clients.jedis.exceptions.jedisception:无法 将资源返回到位于的池中 redis.clients.jedis.JedisPool.returnResource(JedisPool.java:114)位于 redis.clients.jedis.JedisPool.returnResource(JedisPool.java:1)位于 redis.clients.jedis.jedis.close(jedis.java:3306)在 com.lingxia.yueju.data.cache.AdCacheImpl.getAdByCity(AdCacheImpl.java:87) 在 com.lingxia.yueju.data.service.AdServiceImpl.getAdByCity(AdServiceImpl.java:172) 在 com.lingxia.yueju.app.controller.AdController.getBanner(AdController.java:50) 位于的sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 位于java.lang.reflect.Method.invoke(Method.java:483) org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:175) 在 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:446) 在 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:434) 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943) 在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877) 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) 在 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852) 位于javax.servlet.http.HttpServlet.service(HttpServlet.java:618) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) 位于javax.servlet.http.HttpServlet.service(HttpServlet.java:725) org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 在 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658) 在 org.apache.coyote.http11.Http