fix: DB多重接続時に複数スレッドが出来上がってしまう問題の対処

This commit is contained in:
shimoda.m@nds-tyo.co.jp 2023-08-21 18:15:49 +09:00
parent 54d4d09afa
commit aa5bab9f27
6 changed files with 16 additions and 52 deletions

View File

@ -1,21 +0,0 @@
"""FastAPIサーバーの起動・終了イベントのラッパー"""
from typing import Callable
from fastapi import FastAPI
from src.db.tasks import close_db, init_db
def create_start_app_handler(app: FastAPI) -> Callable:
def start_app() -> None:
init_db(app)
return start_app
def create_stop_app_handler(app: FastAPI) -> Callable:
def stop_app() -> None:
close_db(app)
return stop_app

View File

@ -1,14 +0,0 @@
from fastapi import FastAPI
from src.db.database import Database
def init_db(app: FastAPI) -> None:
# DB接続モジュールを初期化
database = Database.get_instance()
# FastAPI App内で使える変数として追加
app.state._db = database
def close_db(app: FastAPI) -> None:
app.state._db = None

View File

@ -1,17 +1,8 @@
from typing import Callable, Type
from fastapi import Depends
from starlette.requests import Request
from src.db.database import Database
from src.repositories.base_repository import BaseRepository
def get_database(request: Request) -> Database:
# medaca_routerでDB接続エンジンが初期化される
return request.app.state._db
def get_repository(Repo_type: Type[BaseRepository]) -> Callable:
def get_repo(db: Database = Depends(get_database)) -> Type[BaseRepository]:
return Repo_type(db)
return get_repo

View File

@ -7,7 +7,6 @@ from starlette import status
import src.static as static
from src.controller import (bio, bio_download, healthcheck, login, logout,
master_mainte, menu, root, ultmarc)
from src.core import tasks
from src.error.exception_handler import http_exception_handler
from src.error.exceptions import UnexpectedException
@ -41,7 +40,3 @@ app.add_exception_handler(status.HTTP_403_FORBIDDEN, http_exception_handler)
# サーバーエラーが発生した場合のハンドラー。HTTPExceptionではハンドリングできないため、個別に設定
app.add_exception_handler(UnexpectedException, http_exception_handler)
# サーバー起動・終了イベントを登録
app.add_event_handler('startup', tasks.create_start_app_handler(app))
app.add_event_handler('shutdown', tasks.create_stop_app_handler(app))

View File

@ -5,6 +5,7 @@ from fastapi.exceptions import HTTPException
from fastapi.routing import APIRoute
from starlette import status
from src.db.database import Database
from src.depends.auth import (check_session_expired, get_current_session,
verify_session)
from src.error.exceptions import DBException, UnexpectedException
@ -75,6 +76,18 @@ class MeDaCaRoute(APIRoute):
return response
class PrepareDatabaseRoute(MeDaCaRoute):
"""事前処理として、データベースのエンジンを作成するルートハンドラー
Args:
MeDaCaRoute (MeDaCaRoute): 共通ルートハンドラー
"""
async def pre_process_route(self, request: Request):
request = await super().pre_process_route(request)
# DBエンジンを構築して状態にセット
request.app.state._db = Database.get_instance()
return request
class BeforeCheckSessionRoute(MeDaCaRoute):
"""事前処理として、セッションチェックを行うルートハンドラー
@ -97,11 +110,11 @@ class BeforeCheckSessionRoute(MeDaCaRoute):
return session_request
class AfterSetCookieSessionRoute(MeDaCaRoute):
class AfterSetCookieSessionRoute(PrepareDatabaseRoute):
"""事後処理として、セッションキーをcookieに設定するカスタムルートハンドラー
Args:
MeDaCaRoute (MeDaCaRoute): 共通ルートハンドラー
PrepareDatabaseRoute (PrepareDatabaseRoute): DBチェックハンドラー
"""
async def post_process_route(self, request: Request, response: Response):
response = await super().post_process_route(request, response)