为了账号安全,请及时绑定邮箱和手机立即绑定

Golang - 许多正在使用的连接

Golang - 许多正在使用的连接

Go
婷婷同学_ 2022-11-23 20:12:28

我试图了解 Max 连接的工作原理。基本上我有这个数据库配置:


params.MinSessions = 5

params.MaxSessions = 6

params.SessionTimeout = 0

params.WaitTimeout = 5 * time.Second

params.SessionIncrement = 0

params.ConnClass = "GOLANGPOOL"


// Connect!

result, err := sql.Open("godror", params.StringWithPassword())

result.SetMaxIdleConns(0)

但是我可以使用 sql.DB.Stats 看到 242 个连接:


DB Established Open Conn (use + idle): 242

DB Idle Conn: 0

DB In Use Conn: 242

DB Max Idle Closed: 766

DB Max Idle Time Closed: 0

DB Max Lifetime Closed: 0

DB Max Open Conn: 0

DB Wait Count: 0

DB Wait Duration (sec): 0

这怎么可能?上限不应该是6个吗?


查看完整描述

3 回答

?
慕仙森

TA贡献1561条经验 获得超7个赞

假设您使用的是最新版本的驱动程序,https://github.com/godror/godror

sql.Open("godror", params.StringWithPassword()) 

implies standaloneConnection=0 setting.

您看到的统计数据来自 go sql 连接池。go sql 调用驱动程序 connect 方法,该方法反过来尝试从另一个池获取连接(OCI 由于设置 standaloneConnection=0 维护它)。

最大出站连接没有超过 params.MaxSessions 但它只是 go sql 连接计数器

numOpen, ....

理想情况下,将 go sql 池设置调整得更接近另一个池值,这样 go 例程就不会阻塞。

您可以使用 godror.Conn 中的 GetPoolStats() 方法检查 OCI 池统计信息,并确认最大出站连接的实际数量。这里的例子

https://github.com/godror/godror/blob/main/z_test.go


查看完整回答
反对 回复 2022-11-23
?
守着星空守着你

TA贡献1522条经验 获得超8个赞

在 Oracle 中连接和会话是不同的概念。

连接是到数据库的网络连接,而会话是用户与数据库交互的封装......

参考这本书,以及Oracle会话和连接池之间的关系


查看完整回答
反对 回复 2022-11-23
?
紫衣仙女

TA贡献1544条经验 获得超15个赞

DB In Use Conn:242 DB Max Idle Closed:766

总和差不多1000,喜欢这个默认值

poolMaxSessions=1000

我认为您没有使用 242 个同时连接。你有一个连接,数据库将限制同时会话的数量。

您应该检查 sql 包如何处理它(它是开源的!)以及特定驱动程序如何处理它(也是开源的!),如果有必要,请在驱动程序项目上打开一个问题

https://github.com/godror/godror


查看完整回答
反对 回复 2022-11-23

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信