我仍然不是 golang 专家,仍在学习中。这也是我第一次接触postgresql
import "github.com/jackc/pgx/v5/pgxpool"
const DB = "postgres://postgres:xxx@localhost:5432/mydb?pool_min_conns=1&pool_max_conns=5&pool_max_conn_idle_time=30s"
dbpool, err := pgxpool.New(context.Background(), DB)
if err != nil {
log.Fatal("Unable to create connection pool: "+err.Error())
}
defer dbpool.Close()
1. 如何从池中获取连接并使用准备好的语句,其中将 SQL 和 SQL 值作为两个单独的参数传递?
来自 PHP,以前从未使用过数据库池。
2. 如何确保从池中拉出连接时是“新鲜”的,并且不会继续执行先前未完成的事务(回滚/提交)?
3. 将连接释放回池时也是如此。如果上下文被取消或者请求失败,它会自动回滚吗?
4. 请求数据库时如何使用goroutines?是否可以在同一事务中进行并行选择查询,或者所有查询都必须是串行的?我想所有写入查询都必须是串行的?
一般来说你不会。该池负责连接的管理(获取和释放)以及准备语句的管理(创建和缓存)。
Acquire
但是,如果您想保持控制,则可以使用该方法或其任何相关方法从池中显式获取连接。类似地,如果您想手动创建并重用准备好的语句(例如,您需要在紧密循环内执行相同的查询,但您不想依赖池对准备好的语句的缓存),那么您可以使用获取的连接的
Conn
方法返回*pgx.Conn
连接的表示形式,并且有一个名为 的方法Prepare
。池的 Acquire 方法返回可用连接。根据定义,正在使用的连接(即未释放的连接)不可用,并且不会由 Acquire 方法返回。
释放回池中的连接所持有的资源,如果不空闲,将被销毁。关于事务提交/回滚,它们都不会被自动调用,文档明确指出:“必须在返回的事务上调用 Commit 或 Rollback 来最终确定事务块”。
游泳池可以安全地同时使用。然而,同时使用
pgxpool.Conn
也不安全。pgxpool.Tx
例子:
Begin
不支持自动回滚或自动提交,您自己必须按照文档所述,调用Rollback
或Commit
来“最终确定事务块”。BeginFunc
但是,如果您想要 pgxRollback
或Commit
交易,您可以使用。