Golang - 许多正在使用的连接

我试图了解 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个吗?


婷婷同学_
浏览 152回答 3
3回答

慕仙森

假设您使用的是最新版本的驱动程序,https://github.com/godror/godrorsql.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

守着星空守着你

在 Oracle 中连接和会话是不同的概念。连接是到数据库的网络连接,而会话是用户与数据库交互的封装......参考这本书,以及Oracle会话和连接池之间的关系。

紫衣仙女

DB In Use Conn:242 DB Max Idle Closed:766总和差不多1000,喜欢这个默认值poolMaxSessions=1000我认为您没有使用 242 个同时连接。你有一个连接,数据库将限制同时会话的数量。您应该检查 sql 包如何处理它(它是开源的!)以及特定驱动程序如何处理它(也是开源的!),如果有必要,请在驱动程序项目上打开一个问题https://github.com/godror/godror
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go