خیلی وقتها توی لاگ Spring Boot این خطا رو میبینیم
Unable to acquire JDBC Connection
Apparent connection leak detected
و اولین واکنش معمولاً اینه:
مقدار pool رو بزرگ کنیم
سرور رو ریاستارت کنیم
اما حقیقت چیز دیگهایه
در ۹۰٪ موارد، مشکل از Transaction اشتباه یا بدجاست
نه از دیتابیس، نه از Hikari.
وقتی از entityManager استفاده میکنیم و روی سرویس Transactional نمیذاریم:
یک Connection از Hikari گرفته میشه
کلاس EntityManager کامیت یا مدیریت connection را به Spring / JPA واگذار نمیکنه و connection ممکنه تا پایان GC یا زمان خیلی طولانی نگه داشته بشه
تمام Connectionهای Pool سریع تمام میشن و درخواستهای بعدی منتظر میمونن
کل سیستم میخوابه
راهحل واقعی و Best Practice:
️ بالا سر متد های سرویس از Transactional(readOnly = true) استفاده کنیم و کوعری های خودمونو با entityManager فقط داخل همان Transaction اجرا کنیم
️ متد های Transactional کوتاه و متمرکز بنویسیم
اینجوری وقتی transaction کامیت یا رول بک میشه connection هم آزاد میشه و پروداکشن سالم میمونه
@DevTwitter | <Mani Nasrollahi/>
Post #11324
6.61K
- ❤ 16
- 👍 2