다른 명령
다중DB 비동기커넥션풀캐시 데코레이터
- 여러 DB 선택 처리를 지원하도록 비동기 커넥션 풀 구조
- 다수의 DB가 db_config.json에 정의
- 데코레이터에서 DB 이름만 바꾸면 자동으로 해당 DB에 접속되도록 구현
db_config.json 예시 (여러 DB)
{
"Database": [
{
"Name": "MyDB1",
"Username": "user1",
"Password": "pass1",
"Host": "localhost",
"Port": 1521,
"ServiceName": "orclpdb1",
"Min": 2,
"Max": 5,
"Increment": 1
},
{
"Name": "MyDB2",
"Username": "user2",
"Password": "pass2",
"Host": "remotehost",
"Port": 1521,
"ServiceName": "orclpdb2",
"Min": 1,
"Max": 3,
"Increment": 1
}
]
}
여러 DB 자동 선택 + 커넥션 풀 캐시 + 데코레이터
import oracledb
import asyncio
import json
from functools import wraps
# 전역 커넥션 풀 저장소
connection_pools = {}
# DB 설정 불러오기
def load_db_config(name):
with open("db_config.json", "r") as f:
config = json.load(f)
for db in config["Database"]:
if db["Name"] == name:
return db
raise ValueError(f"No DB config found for name: {name}")
# DB 이름 기반 커넥션 풀 초기화
async def init_connection_pool(name):
if name in connection_pools:
return connection_pools[name]
cfg = load_db_config(name)
pool = await oracledb.create_pool(
user=cfg["Username"],
password=cfg["Password"],
host=cfg["Host"],
port=cfg["Port"],
service_name=cfg["ServiceName"],
min=cfg["Min"],
max=cfg["Max"],
increment=cfg["Increment"],
getmode=oracledb.SPOOL_ATTRVAL_WAIT,
timeout=10
)
connection_pools[name] = pool
return pool
# 비동기 데코레이터 - DB 선택 가능
def with_async_connection(db_name):
def decorator(func):
@wraps(func)
async def wrapper(*args, **kwargs):
pool = await init_connection_pool(db_name)
async with pool.acquire() as conn:
async with conn.cursor() as cursor:
return await func(cursor, *args, **kwargs)
return wrapper
return decorator
사용 예시: DB별 쿼리
@with_async_connection("MyDB1")
async def get_users_from_db1(cursor):
await cursor.execute("SELECT * FROM users")
return await cursor.fetchall()
@with_async_connection("MyDB2")
async def get_products_from_db2(cursor):
await cursor.execute("SELECT * FROM products")
return await cursor.fetchall()
async def main():
users = await get_users_from_db1()
products = await get_products_from_db2()
print("Users:", users)
print("Products:", products)
if __name__ == "__main__":
asyncio.run(main())
list_alt제목을넣으세요