Spring යෙදුමක @Transactional ඇනෝටේෂන් භාවිතා කරමින් දත්ත සුරැකුම් ක්රියාවලියක් ක්රියාත්මක කරද්දී, HikariCP සම්බන්ධතා තොගය ඉක්මනින් හිස්වීමේ අමුතු ගැටළුවක් හමුවුණා. ඒක තේරුම් ගැනීමට පළමුව මූලික හේතුව හඳුනාගත යුතුය: දත්ත ගබඩාවට සම්බන්ධතාවයක් ගත කරගෙන, ඒ අතරතුර බාහිර සේවාවකට (ActiveMQ, Firebase, S3, SMS) සින්ක්රෝනස් ඇමතුමක් කිරීමයි.
ඉහත ගැටළුවේ මුල් කාරණය වන්නේ, eventPublisher.publish() ක්රියාවලිය Spring හි ApplicationEventPublisher එක භාවිතා කරන අතර, එය පූර්වනිර්දේශිත @EventListener මගින් ඒම ත්රෙඩ් එකේම සින්ක්රෝනස්ව ක්රියා කරයි. එම listener එක JMS (ActiveMQ) වෙත පණිවිඩයක් යවන්නා වූ විට, ජාල සම්බන්ධතාවයේ ප්රමාදයක් හෝ බ්රෝකර් අසාර්ථකත්වයක් ඇති වූ විට, JDBC සම්බන්ධතාවය HikariCP තොගයෙන් ගොඩක් කාලයක් පවතී.
බ්රෝකර් සාර්ථකව ක්රියා කරන විට, මෙම රවුන්ඩ්-ට්රිපය කිලෝ-මිලි තත්පර කිහිපයක් පමණයි, එය වැඩි ප්රමාදයක් නොදැනේ. නමුත් බ්රෝකර් අස්ථාවර වූ විට, සමාන පණිවිඩයක් එවීමට ත්රෙඩ් එක රැඳී, JDBC සම්බන්ධතාවය මුළුමනින්ම නිදහස් නොවීම නිසා HikariCP තොගය හිස්වී, නව ඉල්ලීම් 30 තත්පරක් තවත් ඉවසීමෙන් පසු SQLTransientConnectionException දෝෂය දක්වයි.
ශ්රී ලංකාවට ඇති වැදගත්කම
මෙම ගැටළුව ශ්රී ලංකාවේ මෘදුකාංග සංවර්ධකයින්ට, ව්යාපාරිකයින්ට සහ තාක්ෂණ ශිෂ්යයන්ට විශාල ඉඟියක් ලබා දෙයි.
- කේත ලේඛන සවිස්තරය: @Transactional මත පදනම් වූ ක්රමවේදය තුළ බාහිර API ඇමතුම් සින්ක්රෝනස්ව නොකර, async පරිදි හෝ transaction පසුබැසීමෙන් පසු කරන්නේ වඩා හොඳය.
- දත්ත පාරිභෝගිකත්වය: HikariCP වැනි connection pool එකක් සාර්ථකව භාවිතා කිරීම සඳහා, සම්බන්ධතා දිගු කාලයක් රඳවා නොතබා, thread එකේ resource utilization අඩු කරගත හැක.
- ව්යාපාරික විශ්වාසය: පද්ධතියේ අධි-ලෝඩ් අවස්ථාවල දත්, සේවා අඩු නොවී, පාරිභෝගික අත්දැකීම් නිරන්තරයෙන් හොඳින් පවත්වා ගැනීමට මෙය අත්යවශ්යයි.
ඉදිරියට, Spring Event Listener හෝ JMS පණිවිඩය async ලෙස සැකසීමට @Async annotation එකක්, හෝ transaction පසුකාලීනව event publish කිරීමේ පරිසරයක් (outbox pattern) භාවිතා කිරීමෙන් මෙම ගැටළුව ඉවත් කළ හැක.
අවසන් වශයෙන්, HikariCP pool හි සම්පත් හිස්වීමේ පසුබැසීමේ හේතුව තේරුම් ගැනීම, ඉදිරි සංවර්ධන කාලයේ performance bottleneck වළක්වා ගැනීමට අත්යවශ්යයි.