dbresolver
Golang数据库解析器和包装器,适用于任何多数据库连接拓扑,例如主从复制数据库、跨区域应用程序。
理念和灵感
这个DBResolver库会将您的连接分配到正确定义的数据库。例如,所有读取查询将路由到只读复制数据库,所有写入操作(插入、更新、删除)将路由到主数据库。
阅读更多
用例1:分离的读写和只读数据库连接
点击展开
- 您的应用程序已部署
- 您的应用程序读取操作频繁
- 您的数据库复制到多个副本以加快查询速度
- 您分离连接以优化查询
用例2:跨区域数据库
点击展开
- 您的应用程序部署在多个区域
- 您的数据库已全局配置
用例3:多主数据库
点击展开
- 您使用多主数据库拓扑,例如Aurora多主
支持
入门
下载
go get -u github.com/bxcodec/dbresolver/v2
示例
使用*sql.DB实现DB解析器
点击展开
package main
import (
"context"
"database/sql"
"fmt"
"log"
"github.com/bxcodec/dbresolver/v2"
_ "github.com/lib/pq"
)
func main() {
var (
host1 = "localhost"
port1 = 5432
user1 = "postgresrw"
password1 = "<password>"
host2 = "localhost"
port2 = 5433
user2 = "postgresro"
password2 = "<password>"
dbname = "<dbname>"
)
// 连接字符串
rwPrimary := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", host1, port1, user1, password1, dbname)
readOnlyReplica := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", host2, port2, user2, password2, dbname)
// 打开主数据库连接
dbPrimary, err := sql.Open("postgres", rwPrimary)
if err != nil {
log.Print("连接数据库时出错")
}
// 配置数据库的其他设置,例如追踪等
// 例如,tracing.Postgres(dbPrimary)
// 打开副本数据库连接
dbReadOnlyReplica, err := sql.Open("postgres", readOnlyReplica)
if err != nil {
log.Print("连接数据库时出错")
}
// 配置数据库的其他设置,例如追踪等
// 例如,tracing.Postgres(dbReadOnlyReplica)
connectionDB := dbresolver.New(
dbresolver.WithPrimaryDBs(dbPrimary),
dbresolver.WithReplicaDBs(dbReadOnlyReplica),
dbresolver.WithLoadBalancer(dbresolver.RoundRobinLB))
defer connectionDB.Close()
// 现在您可以使用此连接进行所有数据库操作
_, err = connectionDB.ExecContext(context.Background(), "DELETE FROM book WHERE id=$1") // 将使用主数据库
if err != nil {
log.Print("执行数据库查询时出错", err)
}
connectionDB.QueryRowContext(context.Background(), "SELECT * FROM book WHERE id=$1") // 将使用只读副本数据库
}
重要说明
- 当您调用以下函数时,将使用主数据库
Exec
ExecContext
Begin
(事务将使用主数据库)BeginTx
- 带有"RETURNING"子句的查询
Query
QueryContext
QueryRow
QueryRowContext
- 当您调用以下函数时,将使用副本数据库
Query
QueryContext
QueryRow
QueryRowContext
贡献
要为此项目做出贡献,您可以提交PR或提出问题。