连接池的配置问题

连接池的配置问题

连接池配置是跟着老师的做:

jedis.host = 192.168.0.113
jedis.port = 6379
jedis.pool.maxTotal = 100
jedis.pool.maxIdle = 20
jedis.pool.maxWaitMillis = 3000
jedis.pool.testOnBorrow = true

但是程序总是报错,从下往上看:

先是:Caused by: java.util.NoSuchElementException: Unable to validate object

然后是:redis.clients.jedis.exceptions.JedisExhaustedPoolException: Could not get a resource since the pool is exhausted

我把老师的配置都注释掉,用连接池的默认配置,程序可以正常运行。

对Jedis的连接池并不怎么了解,百度没找到比较系统的文章或博客,还请老师帮忙看一下。

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

6回答
好帮手慕阿满 2020-05-10 18:46:06

同学你好,<property name="testOnBorrow"  value="false"/>可以保证程序正常运行,在实际的开发中,会设置testOnBorrow为false来提供效率。

设置为true应该也是可以正常运行的,老师这边正常运行。这里建议同学先设置testOnBorrow为false,继续向后学习。

祝:学习愉快~

  • 提问者 超人迪加123 #1
    试过将它设置为true了,总是报:Caused by: java.util.NoSuchElementException: Unable to validate object
    2020-05-10 21:08:14
  • 好帮手慕阿满 回复 提问者 超人迪加123 #2
    同学你好,如果这里设置testOnBorrow为false可以执行,建议同学先设置为false,继续向后学习。
    2020-05-11 16:24:37
提问者 超人迪加123 2020-05-10 13:47:03

大概找到问题在哪里了,

http://img1.sycdn.imooc.com//climg/5eb792e90994334507640036.jpg

把testOnBorrow改为false程序就能正常运行了。但这样也就表示在获取连接时不作检查,这样获取到的连接能确保程序正常运行吗?

如果一定要设置为true,那怎么办?

好帮手慕阿满 2020-05-10 11:03:10

同学你好,问一下同学使用的本地的Redis吗?如果是,如下配置应该改为localhost,如:

http://img1.sycdn.imooc.com//climg/5eb76ecd0922201e05030301.jpg

祝:学习愉快~

  • 提问者 超人迪加123 #1
    连接的是vm ware 里面的linux的redis
    2020-05-10 12:50:42
  • 提问者 超人迪加123 #2
    尝试把ip改为localhost,出现以下异常信息。 Caused by: java.net.ConnectException: Connection refused: connect 尝试不经过连接池连接redis,也是报Caused by: java.net.ConnectException: Connection refused: connect异常
    2020-05-10 12:58:00
提问者 超人迪加123 2020-05-09 20:49:23
提问者 超人迪加123 2020-05-09 20:35:55

这里是

jedis.properties配置:

jedis.host = 192.168.0.113
jedis.port = 6379
jedis.pool.maxTotal = 100
jedis.pool.maxIdle = 20
jedis.pool.maxWaitMillis = 30000
jedis.pool.testOnBorrow = true


这里是

spring_redis.xml配置:

<context:property-placeholder location="classpath:jedis.properties" ignore-unresolvable="true"/>

<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
   <!--当前这个连接池的连接数最大值-->
   <property name="maxTotal" value="${jedis.pool.maxTotal}"/>
   <!--当前这个连接池中空闲并随时待命的连接数最大值-->
   <property name="maxIdle" value="${jedis.pool.maxIdle}"/>
   <!--当前这个连接池 如果没有可用的空闲的连接时,等待连接归还的时间的最大值,超出则抛出异常-->
   <property name="maxWaitMillis" value="${jedis.pool.maxWaitMillis}"/>
   <!--在获取连接时,连接池会检查当前这个连接是否有效,如果无效则重新获取下一条连接-->
   <property name="testOnBorrow"  value="${jedis.pool.testOnBorrow}"/>
</bean>

<bean id="jedisPoolUtil" class="com.imooc.o2o.cache.JedisPoolUtil">
   <constructor-arg index="0" ref="jedisPoolConfig"/>
   <constructor-arg index="1" value="${jedis.host}"/>
   <constructor-arg index="2" value="${jedis.port}"/>
</bean>

<bean id="jedisUtil" class="com.imooc.o2o.cache.JedisUtil">
   <property name="jedisPool" ref="jedisPoolUtil"/>
</bean>


这里是

java工具类JedisPoolUtil:

public class JedisPoolUtil {

   private JedisPool jedisPool;

   public JedisPoolUtil() {

   }

   public JedisPoolUtil(final JedisPoolConfig config, final String host, final int port) {
       try {
           jedisPool = new JedisPool(config, host, port);
       } catch (Exception e) {
           throw e;
       }
   }

   public JedisPool getJedisPool() {
       return jedisPool;
   }

   public void setJedisPool(JedisPool jedisPool) {
       this.jedisPool = jedisPool;
   }
}


这里是

java工具类JedisUtil:


public class JedisUtil {

   private JedisPool jedisPool;

   public JedisUtil() {

   }

   public Jedis getJedis() {
       return jedisPool.getResource();
   }

   public JedisPool getJedisPool() {
       return jedisPool;
   }

   public void setJedisPool(JedisPoolUtil jedisPool) {
       this.jedisPool = jedisPool.getJedisPool();
   }

}


这里是

Junit测试方法:

@Test
public void jedisTest() {
   Jedis jedis = jedisUtil.getJedis();
   jedis.auth("553774989");
   String pong = jedis.ping();
   System.out.println(pong);
   jedis.select(0);
   jedis.set("pretty", "girl");
   String pretty = jedis.get("pretty");
   System.out.println(pretty);
}


这里是

异常信息:

redis.clients.jedis.exceptions.JedisExhaustedPoolException: Could not get a resource since the pool is exhausted

    at redis.clients.jedis.util.Pool.getResource(Pool.java:53)
    at redis.clients.jedis.JedisPool.getResource(JedisPool.java:288)
    at com.imooc.o2o.cache.JedisUtil.getJedis(JedisUtil.java:15)
    at com.imooc.o2o.cache.JedisTest.jedisTest(JedisTest.java:20)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
    at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: java.util.NoSuchElementException: Unable to validate object
    at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:486)
    at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:349)
    at redis.clients.jedis.util.Pool.getResource(Pool.java:50)
    ... 33 more


好帮手慕柯南 2020-05-09 18:49:28

同学你好!

  1. 一般情况都会使用连接池管理redis,这样可以避免资源的浪费

  2. 老师这里是源码是没有报错的,建议同学可以贴一下你报错的配置、以及项目结构。老师在本地测试一下。

祝学习愉快~

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师