Java Can';当我把它放在线绳上时,它不能成功地接近绝地
我只想在一个线程中保存一个绝地实例,所以我编写了一个引用HibernateSessionFactory的类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
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