在我当前的项目中,每次用户发出请求时,我都会打开一个新的数据库连接。例如:
func login(w http.ResponseWriter, r *http.Request) {
...
db, err := sqlx.Connect("postgres", "user=postgres password=*** dbname=postgres")
if err != nil {
ErrorWithJSON(w, err.Error(), http.StatusBadRequest)
return
}
db.SetMaxIdleConns(0)
db.SetConnMaxLifetime(time.Second * 30)
user, err := loginManager(db, m)
...
err = db.Close()
}
当我搜索其他人的代码时,我发现大多数开发人员都会为数据库连接创建一个全局变量,在全局变量上进行设置,然后在整个项目中使用该变量。
我想知道这些方法之间有什么区别吗?如果我使用全局变量,那么当5个不同的用户进行注册/登录等请求时,会有任何延迟。如果会有延迟,我是否应该创建多个数据库连接并将它们存储在一个切片中以供将来使用,以便我可以在用户使用时随机选择提出要求。就像一个简单的负载均衡器一样,我不知道吗?
抱歉,有多个问题。谢谢!
是的,可能会有巨大的性能差异(取决于您运行的查询的性质以及系统和服务器配置,可能有几个数量级)。
该sqlx.DB
类型包装(嵌入)一个sql.DB
类型,该类型管理连接池:
DB是代表零个或多个基础连接池的数据库句柄。对于多个goroutine并发使用是安全的。
sql软件包会自动创建并释放连接。它还维护空闲连接的空闲池。如果数据库具有每个连接状态的概念,则只能在事务中可靠地观察到这种状态。
每次打开新连接时,“背景”中都会发生很多事情:必须解析连接字符串,必须建立TCP连接,必须执行身份验证/授权,必须在两侧分配资源(客户端和服务器)等。这些只是主要的,显而易见的内容。即使可以优化/缓存来提供/实现其中一些功能,但是与拥有一个DB
实例(可能在池中准备好多个已建立的经过身份验证的连接,等待使用/利用)的单个实例相比,仍然存在大量开销。
也引用自sql.Open()
:
返回的数据库可安全地供多个goroutine并发使用,并维护其自己的空闲连接池。 因此,Open函数应仅被调用一次。 很少需要关闭数据库。
sqlx.Connect()
您使用的电话sqlx.Open()
是
“同sql.Open,但返回的* sqlx.DB代替” 。
因此,总而言之,请使用一个全局sqlx.DB
或sql.DB
实例,并在任何地方共享/使用它。它为您提供自动连接和连接池管理。这将为您提供最佳性能。您可以微调与连接池DB.SetConnMaxLifetime()
,DB.SetMaxIdleConns()
和DB.SetMaxOpenConns()
方法。
空闲连接(DB.SetMaxIdleConns()
)是当前未使用但坐在游泳池中,等待有人将其捡起的那些连接。您绝对应该拥有其中的一些,例如5或10,甚至更多。DB.SetConnMaxLifetime()
控制使用新连接的时间。一旦它变老了,它将被关闭(如果需要,将打开一个新的)。您不应该更改此设置,默认行为是永不终止连接。基本上所有默认设置都是明智的,只有在遇到性能问题时才应使用它们。另外,请阅读这些方法的文档以清楚了解。
本文向大家介绍golang中连接mysql数据库,包括了golang中连接mysql数据库的使用技巧和注意事项,需要的朋友参考一下 golang中连接mysql数据库,需要使用一个第三方类库github.com/go-sql-driver/mysql,在这个类库中就实现了mysql的连接池,并且只需要设置两个参数就可以实现 一般连接mysql首先需要调用sql.Open函数,但是此时并没有真正的去
问题内容: 在许多使用MongoDB的入门示例中,您将看到类似以下的代码: 如果MongoDB与任何其他数据库系统一样,并且操作通常在时间上很昂贵。 所以,我的问题是这样的:只需执行一次,将返回值分配给某个全局模块即可,模块中具有各种功能就可以进行各种与数据库相关的工作(将文档插入集合,更新文档等)。 ),然后由应用程序的其他部分调用它们(从而重新使用该值),然后,在应用程序完成后,才执行。 换句
我遇到了这个问题:对于Vaadin7,我已经配置了我的持久性。xml,下面是代码 http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd“version=“2.0” 当我创建一个新的JPA容器并将其绑定到一个表时,我会在MSSQL活动监视器上看到我的新连接,但如果会话超时或注销,我仍然会在SQL上看到连接。 如果我在应用程序中重新登录,
本文向大家介绍面向连接的服务和无连接的服务之间的差异。,包括了面向连接的服务和无连接的服务之间的差异。的使用技巧和注意事项,需要的朋友参考一下 这些服务都用于在两个或多个设备之间建立连接。这些服务是网络层的一部分。 面向连接的服务 面向连接的服务就像电话系统。它以建立连接开始,以连接终止结束。该服务使用握手方法在发送方和接收方之间建立连接。 无连接服务 面向连接的服务就像一个邮政系统。它不必建立连
问题内容: 问题答案: 检查一下 数据库名称 ip 用户名和密码是否正确,尝试使用客户端连接一下,是否可以连上
得到一些问题与桌子布线。我需要为每个用户uniq购物车,在那里我将存储书籍。 当我在DB中打开AppUser表时,“cart_id”列始终为NULL。 购物车表只有id列-不确定是否应该这样 谢谢! 购物车