Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database golang sqlite数据库连接池_Database_Sqlite_Error Handling_Go - Fatal编程技术网

Database golang sqlite数据库连接池

Database golang sqlite数据库连接池,database,sqlite,error-handling,go,Database,Sqlite,Error Handling,Go,当我在读取的同时调用数据库write时,SQLite在我的机器中造成了麻烦。当不同的方法同时尝试访问数据库时,就会发生这种情况 我所做的与中所做的类似,公认的答案解释了如何使用数据库事务来避免数据库锁定 以下是我的一些代码: stmt, err := dbtx.Prepare(`statement`) if err != nil { log.Fatal(err) } _, err = stmt.Exec(values, values, values) if err != nil {

当我在读取的同时调用数据库write时,SQLite在我的机器中造成了麻烦。当不同的方法同时尝试访问数据库时,就会发生这种情况

我所做的与中所做的类似,公认的答案解释了如何使用数据库事务来避免数据库锁定

以下是我的一些代码:

stmt, err := dbtx.Prepare(`statement`)
if err != nil {
    log.Fatal(err)
}

_, err = stmt.Exec(values, values, values)
if err != nil {        
    log.Fatal(err)
}

err = dbtx.Commit()
if err != nil {
    fmt.Println("database lock?")
    fmt.Println(err)
    dbtx.Rollback()
}

fmt.Println("Database storage complete!")
令人困惑的是,程序在输出以下内容后仍然存在:

database lock?
database is locked
Database storage complete!
2014/09/09 18:33:11 database is locked
exit status 1
我不希望我的程序在数据库锁定时停止,我希望它将数据存储在内存中并继续其业务,直到数据库解锁,我可以重试

是否有一些标准方法可以实现这一点,可能是某种队列或数据结构,或者是否有一种特定于数据库的方法来解决这个问题

为什么程序在输出
数据库存储完成后退出

编辑:

我相信我已经解决了这个问题,但我不能肯定。我正在使用goroutines和包范围的DB连接。以前,在调用数据库连接时,代码中的每个func都在初始化数据库连接。现在,我在包的顶部为DB连接定义了一个“全局”变量,并在任何例程开始之前进行了初始化。简而言之,代码如下:

var nDB *sql.DB
稍后在主功能中

mypkg.InitDB()
go mypkg.RunDatabaseOperations()
mypkg.BeginHTTPWatcher(rtr)
InitDB()
定义如下:

func InitDB() {
    fmt.Println("Init DB ...")
    var err error
    nDB, err = sql.Open("sqlite3", "./first.db")
    if err != nil {
        log.Fatal(err)
    }
    if nDB == nil {
        log.Fatal(err)
    }
    fmt.Printf("nDB: %v\n", ODB)
    fmt.Println("testing db connection...")
    err2 := nDB.Ping()
    if err2 != nil {
        log.Fatalf("Error on opening database connection: %s", err2.Error())
    }
}

因此,
RunDatabaseOperations
定期扫描在线资源以查找数据,并在发生更改时(每隔几秒钟一次)将其存储到数据库中
BeginHTTPWatcher
侦听HTTP请求,以便可以从正在运行的程序中读取数据,并通过有线传输到数据的请求者,无论是本地请求还是外部请求。我还没有遇到问题。

请发布更多的代码,以便我们能够更全面地了解发生了什么

然而,这里有一些想法。默认情况下,Golang池db连接(尽管CENTOS似乎没有…)。此外,您的程序正在“停止”,因为它正在等待来自db连接池的打开连接。如果希望程序的其余部分在此期间继续运行,则应将其作为异步函数运行-签出。这将有效地导致您的程序按照您的意愿排队,因为连接将按请求的顺序分配,只要它们可用。如果你对内部结构感兴趣

如果您需要一些关于goroutine外观的代码片段,请告诉我们。

说明:

如果没有外部同步,单个连接实例及其所有派生对象(准备好的语句、备份操作等)不能从多个goroutine并发使用

(这是一个不同的SQLite驱动程序,但此限制也适用于您的驱动程序。)

使用goroutines时,必须使用单独的数据库连接

默认情况下,当SQLite遇到被另一个事务锁定的数据库时,它会立即中止。 为了允许更多的并发性,您可以通过设置忙超时来告诉它等待其他事务完成


如果您的SQLite驱动程序拥有该函数,请使用该函数,或者直接执行SQL命令。

2014/09/09 18:33:11数据库已锁定
看起来像是
log.Fatal(err)
work。你能提供更多的信息来制作测试样本吗?您使用哪个sqlite提供程序?我使用的是
github.com/mattn/go-sqlite3
似乎是一个并发问题。。。您是否同时运行此代码?如果是这样,请发布更多代码,以便我们了解发生了什么。根据您接受的答案,您是否将goroutine RunDatabaseOperations()更改为建立单独的数据库连接,而不是使用全局包范围的连接?我使用全局包范围的连接,但每个例程都使用
.Begin()创建一个新事务
。另外,根据mattn自己的建议,在
InitDB
函数中,我现在使用以下额外参数打开数据库:
nDB,err=sql.Open(“sqlite3”,“/first.db?cache=shared&mode=wrc”)
。我已经用我现在使用的代码更新了我的原始帖子,一切似乎都很好,但我不确定是否正确使用了goroutines和包范围的DB连接。