在golang中共享接口之间的conn指针

时间:2015-03-02 17:09:26

标签: go

我想要完成的是在多个函数之间共享一个db.sqlx的指针,除了帖子说沿指针传递,这很好但是如何在接口中这样做?我找不到任何可以说明在任何地方使用它的东西。基本上我所拥有的是Datastore类型的接口。我也有mysql&实现数据存储区类型的pgsql。接口本身工作正常,但问题是我试图为* sqlx.DB创建单个连接函数,以便在实现的接口中的所有函数之间共享。我认为问题是我在如何分享界面功能之间的指针或甚至"其中"分享它。主界面如下所示:

var (
    storage Datastore
    db * sqlx.DB
)

type Datastore interface {
    Insert(db *sqlx.DB, table string, item DataItem) bool
    CheckEmpty(db *sqlx.DB, table string) bool
    FetchAll(db *sqlx.DB, table string) []DataItem
    DBInit(db *sqlx.DB)
    initDB()
}

在我实现的接口(简化的mysql示例)中,我有initDB函数,如下所示:

type MySQLDB struct {
    config *config.Configuration
}


func (my *MySQLDB) initDB() {
    log.Println("Getting DB Connection")
    tempdb, err := sqlx.Connect("mysql", my.config.Database.Dsn+"&parseTime=True")
    if err != nil {
        log.Println(err.Error())
    }
    db = tempdb
    defer db.Close()
}

func (my *MySQLDB) FetchAll(db *sqlx.DB, table string) []DataItem {
    dTable := []DataItem{}
    query := "SELECT foo, bar FROM " + table + " ORDER BY last_update ASC"
    err := db.Select(&dTable, query)
    if err != nil{
        panic(err)
    }
    return dTable
}

此时我知道连接最初是打开的,但是下次调用一个函数时我得到db is closed错误。那么如何正确地共享函数之间的数据库连接,还是我真的必须在每个函数中运行连接?

1 个答案:

答案 0 :(得分:2)

请勿在 initDB 函数中调用延迟db.Close()。执行该功能后,db也会关闭!因此,当您调用方法时,您会收到关闭的错误 也许您需要重新设计界面,例如:

type Datastore interface {
    Insert(table string, item DataItem) bool
    CheckEmpty(table string) bool
    FetchAll(table string) []DataItem
    Close() error // call this method when you want to close the connection
    initDB()
}

您的 MySQLDB 工具现在看起来像:

type MySQLDB struct {
    config *config.Configuration
    db *sqlx.DB
}


func (my *MySQLDB) initDB() {
    log.Println("Getting DB Connection")
    tempdb, err := sqlx.Connect("mysql", my.config.Database.Dsn+"&parseTime=True")
    if err != nil {
        log.Println(err.Error())
    }
    my.db = tempdb
}

func (my *MySQLDB) Close() error {
    return my.db.Close()
}

func (my *MySQLDB) FetchAll(table string) []DataItem {
    dTable := []DataItem{}
    query := "SELECT foo, bar FROM " + table + " ORDER BY last_update ASC"
    err := my.db.Select(&dTable, query)
    if err != nil{
        panic(err)
    }
    return dTable
}