@xtccc
2016-12-05T20:30:23.000000Z
字数 1287
阅读 2315
开发技巧
参考:
借助于 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个可用的RedisClient
val 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")