@xtccc
2016-12-05T12:30:23.000000Z
字数 1287
阅读 2597

开发技巧参考:
借助于 Apache Commons Pool 我们可以自己实现pooling,例如Phoenix Connection/Redis Connection连接池。
首先以Redis Connector Pooling 为例。
我们将使用一个Scala的Redis Connection Client, debasishg/scala-redis。
它的基本用法是:
import com.redis._val r = new RedisClient("localhost", 6379)r.set("key", "some value")r.get("key")
下面我们要为它引入pooling机制。
首先要实现一个Factory,它定义了怎样为RedisClient生成PooledObject以及怎样创建一个新的RedisClient。
这里我们使用默认的BasePooledObjectFactory。
class RedicClientFactory(host: String, port: Int)extends BasePooledObjectFactory[RedisClient] {override def wrap(client: RedisClient): PooledObject[RedisClient] =new DefaultPooledObject[RedisClient](client)override def create(): RedisClient = new RedisClient(host, port)}
现在可以使用上面定义的pool。
val pool = new GenericObjectPool[RedisClient](new RedicClientFactory(Host, Port))pool.setMaxTotal(30)//pool.setMaxIdle(0) 不能将maxIdle设置地太小,不设置就可以pool.setBlockWhenExhausted(true)val manager = new RedisConnManager(pool)// 开启5000个并发的线程去调用RedisClient// 但是Pool中最多只有30个可用的RedisClientval tasks =for (i <- Range(0, 5000)) yield Future {val client = manager.borrowConn()val v = client.get("kk")if (v.isEmpty)client.set("kk", 1)else {println(i + " : " + v.get)client.set("kk", v.get.toInt + 1)}Thread.sleep(100)manager.returnConn(client)}Await.result(Future.sequence(tasks), 2000 seconds)println("down")
