2017-12-11 6 views
0

장고 버전 1.11, sqlite3 버전 3.11.django에서 "데이터베이스 잠김"sqlite3 오류를 방지하려면 어떻게합니까?

나는 WAL 모드와 긴 제한 시간을 사용하고 있습니다 :

from django.apps import AppConfig 
from django.db.backends.signals import connection_created 


class SQLite3Config(AppConfig): 
    name = 'sqlite3_config' 

    def ready(self): 
     connection_created.connect(configure_sqlite) 


# noinspection PyUnusedLocal 
def configure_sqlite(sender, connection, **_): 
    if connection.vendor == 'sqlite': 
     cursor = connection.cursor() 
     cursor.execute('PRAGMA journal_mode=WAL;') 
     cursor.execute('PRAGMA busy_timeout=5000;') 

내가 sqlite3를 유지하고 응용 프로그램이 작고 여러 서버에 사용자가 설치되어 있기 때문에 MySQL의 또는 포스트 그레스로 이동하지 싶습니다.

나는 WAL이 그들을 직렬화함으로써 "동시"쓰기를 허용해야한다고 생각한다. "데이터베이스 잠김"문제는 작은 버스트 (반 다스 정도)가 함께 수신되었을 때 관찰되었습니다.

스레드로 쉘에서 문제를 재현 할 수 있습니다. 장고 모델 메소드는 플래그를 설정하고 모델을 저장합니다

def activate(self): 
    self.activate = True 
    self.save() 

내가 스레드를 사용하면 내가 같은 시간에 그것을 시도 할 몇 스레드를 실행하면 실패 찾을 수 있습니다. 대기 시간이 없으므로 시간 초과가 관련되지 않습니다. 오초 바쁜 시간 제한 (2 초 미만에) 경과하기 전에 오류가 발생합니다 : 내가 릴리스 노트에서 아무것도 볼 수 없습니다

In [2]: [NGThread(notifier_group.id).start() for notifier_group in NotifierGroup.objects.all()[:2]] 
Out[2]: [None, None] 

In [3]: [NGThread(notifier_group.id).start() for notifier_group in NotifierGroup.objects.all()[:3]] 
Out[3]: [None, None, None] 

In [4]: [NGThread(notifier_group.id).start() for notifier_group in NotifierGroup.objects.all()[:4]] 
Out[4]: [None, None, None, None] 

In [5]: Exception in thread Thread-97: 
Traceback (most recent call last): 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/db/backends/utils.py", line 65, in execute 
    return self.cursor.execute(sql, params) 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/db/backends/sqlite3/base.py", line 328, in execute 
    return Database.Cursor.execute(self, query, params) 
sqlite3.OperationalError: database is locked 

The above exception was the direct cause of the following exception: 

Traceback (most recent call last): 
    File "/usr/lib/python3.5/threading.py", line 914, in _bootstrap_inner 
    self.run() 
    File "/home/paul/wk/cliosoft/sosadmin/scratch.py", line 41, in run 
    toggle_active(notifier_group) 
    File "/home/paul/wk/cliosoft/sosadmin/scratch.py", line 30, in toggle_active 
    model.activate() 
    File "/home/paul/wk/cliosoft/sosadmin/notifications/models/notifier_group.py", line 67, in activate 
    self.save() 
    File "/home/paul/wk/cliosoft/sosadmin/notifications/models/notifier_group.py", line 33, in save 
    self.verify() 
    File "/home/paul/wk/cliosoft/sosadmin/notifications/models/notifier_group.py", line 46, in verify 
    self.create_notifier(base_spec, model_set, group_event_condition) 
    File "/home/paul/wk/cliosoft/sosadmin/notifications/models/notifier_group.py", line 57, in create_notifier 
    notifier.users = self.users.all() 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/db/models/fields/related_descriptors.py", line 534, in __set__ 
    manager.set(value) 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/db/models/fields/related_descriptors.py", line 1004, in set 
    self.add(*new_objs) 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/db/models/fields/related_descriptors.py", line 931, in add 
    self._add_items(self.source_field_name, self.target_field_name, *objs) 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/db/models/fields/related_descriptors.py", line 1100, in _add_is 
    for obj_id in new_ids 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/db/models/query.py", line 442, in bulk_create 
    ids = self._batched_insert(objs_without_pk, fields, batch_size) 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/db/models/query.py", line 1083, in _batched_insert 
    self._insert(item, fields=fields, using=self.db) 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/db/models/query.py", line 1060, in _insert 
    return query.get_compiler(using=using).execute_sql(return_id) 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 1099, in execute_sql 
    cursor.execute(sql, params) 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/db/backends/utils.py", line 80, in execute 
    return super(CursorDebugWrapper, self).execute(sql, params) 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/db/backends/utils.py", line 65, in execute 
    return self.cursor.execute(sql, params) 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/db/utils.py", line 94, in __exit__ 
    six.reraise(dj_exc_type, dj_exc_value, traceback) 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/utils/six.py", line 685, in reraise 
    raise value.with_traceback(tb) 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/db/backends/utils.py", line 65, in execute 
    return self.cursor.execute(sql, params) 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/db/backends/sqlite3/base.py", line 328, in execute 
    return Database.Cursor.execute(self, query, params) 
django.db.utils.OperationalError: database is locked 

Exception in thread Thread-98: 
Traceback (most recent call last): 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/db/backends/utils.py", line 65, in execute 
    return self.cursor.execute(sql, params) 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/db/backends/sqlite3/base.py", line 328, in execute 
    return Database.Cursor.execute(self, query, params) 
sqlite3.OperationalError: database is locked 

The above exception was the direct cause of the following exception: 

Traceback (most recent call last): 
    File "/usr/lib/python3.5/threading.py", line 914, in _bootstrap_inner 
    self.run() 
    File "/home/paul/wk/cliosoft/sosadmin/scratch.py", line 41, in run 
    toggle_active(notifier_group) 
    File "/home/paul/wk/cliosoft/sosadmin/scratch.py", line 28, in toggle_active 
    model.deactivate() 
    File "/home/paul/wk/cliosoft/sosadmin/notifications/models/notifier_group.py", line 72, in deactivate 
    self.save() 
    File "/home/paul/wk/cliosoft/sosadmin/notifications/models/notifier_group.py", line 33, in save 
    self.verify() 
    File "/home/paul/wk/cliosoft/sosadmin/notifications/models/notifier_group.py", line 46, in verify 
    self.create_notifier(base_spec, model_set, group_event_condition) 
    File "/home/paul/wk/cliosoft/sosadmin/notifications/models/notifier_group.py", line 57, in create_notifier 
    notifier.users = self.users.all() 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/db/models/fields/related_descriptors.py", line 534, in __set__ 
    manager.set(value) 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/db/models/fields/related_descriptors.py", line 1004, in set 
    self.add(*new_objs) 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/db/models/fields/related_descriptors.py", line 931, in add 
    self._add_items(self.source_field_name, self.target_field_name, *objs) 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/db/models/fields/related_descriptors.py", line 1100, in _add_is 
    for obj_id in new_ids 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/db/models/query.py", line 442, in bulk_create 
    ids = self._batched_insert(objs_without_pk, fields, batch_size) 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/db/models/query.py", line 1083, in _batched_insert 
    self._insert(item, fields=fields, using=self.db) 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/db/models/query.py", line 1060, in _insert 
    return query.get_compiler(using=using).execute_sql(return_id) 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 1099, in execute_sql 
    cursor.execute(sql, params) 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/db/backends/utils.py", line 80, in execute 
    return super(CursorDebugWrapper, self).execute(sql, params) 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/db/backends/utils.py", line 65, in execute 
    return self.cursor.execute(sql, params) 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/db/utils.py", line 94, in __exit__ 
    six.reraise(dj_exc_type, dj_exc_value, traceback) 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/utils/six.py", line 685, in reraise 
    raise value.with_traceback(tb) 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/db/backends/utils.py", line 65, in execute 
    return self.cursor.execute(sql, params) 
    File "/home/paul/.virtualenvs/sosadmin/lib/python3.5/site-packages/django/db/backends/sqlite3/base.py", line 328, in execute 
    return Database.Cursor.execute(self, query, params) 
django.db.utils.OperationalError: database is locked 
+0

IHMO, 당신은 sqlite3을 잘 사용하려고 생각하고 있습니다. 스케쥴링 미들웨어를 사용하더라도 디자인 범위가 아닙니다. sqlite3 문서에 따르면 한 번에 하나의 작성자 만있을 수 있으며 해당 활동도 공유 (읽기) 액세스를 중지합니다. 나는 왜 당신이 "뚱뚱한"완전한 기능의 데이터베이스를 사용하는 것에 무관심한 지 알게되었지만, sqlite3은 파일을 다른 것과 공유하지 않는 작은 임베디드 시스템이나 응용 프로그램 (기본적으로 단일 사용자 액세스)에서 사용하는 것이 가장 좋습니다. ref : https://www.sqlite.org/lockingv3.html STRAUX 수신기에서 거의 매일 sqlite3 데이터베이스를 사용합니다. – DDeMartini

+0

당신은 맞을지도 모르지만 WAL과 sqlite3 그리고 사실이 응용 프로그램은 많이 읽습니다, 드물게 (때때로 작은 버스트로) 나는 sqlite3 *를 잘 처리해야한다고 생각하게 만듭니다. 설명서의 필자는이 오류가 실제로 sqlite3 쓰기 제한 사항을 치는 경우 시간 초과 경과보고해야하며 그 볼 수 없다는 것을 의미합니다. –

답변

0

하지만 장고 2.0로 업그레이드 한이 문제는 이제 사라졌다 . WAL이 sqlite3에 설정되어 이제는 모두 잘 작동합니다.

+0

흥미 롭습니다. 알아 둘만한. – DDeMartini