2015-09-09 4 views
4

Я использую базу данных sqlite3 в golang, и я получил ошибку: «база данных заблокирована».Ошибка Sqlite3: база данных заблокирована в golang

Я знаю, что не может быть нескольких потоков, используя тот же файл базы данных.

Хотя я получаю только одно соединение в своей программе и закрываю все результаты запросов, но он всегда создает 2 или 3 дескриптора файла базы данных.

Я облака проверяю, используя программу opendfileview.

Может ли кто-нибудь помочь мне с этой проблемой. Спасибо заранее.

Следующий код создает два файла базы данных.

func main() { 
    database, tx, err := getDatabaseHandle() 
    if err != nil { 
     log.Fatal(err) 
    } 
    defer database.Close() 
    dosomething(database, tx) 
} 
func dosomething(database *sql.DB, tx *sql.Tx) error { 
    rows, err := database.Query("select * from sometable where name=?","some") 
    if err != nil { 
     return err 
    } 
    if rows.Next() { 
     ... 
    } 
    rows.Close() 
    //some insert queries 
    tx.Commit() 
} 
func getDatabaseHandle() (*sql.DB, *sql.Tx, error) { 
    database, err := sql.Open("sqlite3", dbPath) 
    if err != nil { 
     fmt.Println("Failed to create the handle") 
     return nil, nil, err 
    } 
    if err2 := database.Ping(); err2 != nil { 
     fmt.Println("Failed to keep connection alive") 
     return nil, nil, err 
    } 
    tx, err := database.Begin() 
    if err != nil { 
     return nil, nil, err 
    } 
    return database, tx, nil 
} 
+1

Вы должны предоставить подробную информацию, особенно код, который демонстрирует вашу проблему. – Volker

+0

Вы уверены, что [что-то еще не блокирует вашу БД] (http://stackoverflow.com/questions/151026/how-do-i-unlock-a-sqlite-database)? –

+0

Отсутствует дескриптор файла базы данных до запуска моей программы, но 2 дескриптора после запуска моей программы. Поэтому я думаю, что сама моя программа блокирует файл базы данных. – superuser123

ответ

10

Попробуйте defering rows.Close():

if err != nil { 
    return err 
} 
defer rows.Close() 
if rows.Next() { 
    ... 
} 
+0

Вы попали в точку. Я решил свою проблему, закрыв все «строки» в моем коде. Хотя ваш ответ не является точным решением моей проблемы, но я проверю ваш ответ. Спасибо, что ответили. – superuser123

+0

Рад, что это помогло! –

+1

Отлично! Спасибо огромное! Я даже не знал, что вы должны закрывать строки помимо обработчика базы данных; Я думал, что это будет «автоматически», но это явно не так. Кроме того, такая же проблема возникает с _statements_; Я использую https://godoc.org/github.com/mattn/go-sqlite3, и есть функция func для закрытия инструкций, а также после их использования. Как только я это сделал, ужасная ошибка «база данных заблокирована» исчезла, после чего у меня болит голова в течение нескольких дней! –

Смежные вопросы