我在lambda函数中使用golang连接到redis。当我第一次调用lambda时,会创建一个新的连接池,并且进一步调用lambda似乎会使用该池来获取连接。但是,当我添加con.close()行时,对lambda的第二个调用崩溃,第三个调用将重新创建池。如果我不关闭连接有什么风险吗?或者我可以用其他方法关闭连接吗?
我在cloud watch日志中得到的错误是pool.get()行上的“运行时错误,无效内存地址或nil指针”,看起来pool变量是nil?
func newPool(addr string) *redis.Pool {
return &redis.Pool{
MaxIdle: 3,
IdleTimeout: 240 * time.Second,
// Dial or DialContext must be set. When both are set, DialContext takes precedence over Dial.
Dial: func () (redis.Conn, error) { return redis.Dial("tcp", addr) },
}
}
var pool *redis.Pool
func init(){
pool = newPool()
}
func Handle(ctx context.context, req events.APIGatewayWebsocketProxyRequest)(interface{},error){
//make new redis connection
con:= pool.get()
con.close()
}
2条答案
按热度按时间wmomyfyw1#
加一个怎么样
defer con.close()
在句柄函数中?因为在handle函数被调用之后,它将关闭con。mqxuamgl2#
看起来你一打开连接就要关闭连接了,所以是的,lambda会自杀。
您可以使用某种循环保持连接的活动状态,处理消息,然后退出循环以关闭连接。反过来又会杀死羔羊。
你可以设置你的lambda是长寿命的,这只会不断招致成本。
一旦你的handle方法完成,lambdas就会自杀。