
рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ, рдПрдХ рдЕрдкреНрд░рд┐рдп рдХрд╣рд╛рдиреА рдореЗрд░реЗ рд╕рд╛рде рдШрдЯрд┐рдд рд╣реБрдИ, рдЬрд┐рд╕рдиреЗ рдПрдХ рдЧреАрдереВрдм рдкрд░ рдПрдХ рдЫреЛрдЯреА рд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреНрд░рд┐рдЧрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реБрдЖред
рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рджрд┐рди, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд░рд┐рд▓реАрдЬ: рд╣рдорд╛рд░реЗ рдХреНрдпреВрдП рдЗрдВрдЬреАрдирд┐рдпрд░ рджреНрд╡рд╛рд░рд╛ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдКрдкрд░ рдФрд░ рдиреАрдЪреЗ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд╡рд┐рддреНрд░ рдЧрд╛рдп рдХреА рд╢рд╛рдВрддрд┐ рдХреЗ рд╕рд╛рде рд╣рдо рдордВрдЪ рдкрд░ "рд░реЛрд▓" рдХрд░рддреЗ рд╣реИрдВред рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЕрдЪреНрдЫрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЙрдЧ рдореЗрдВ - рдореМрдиред рд╣рдо рд╕реНрд╡рд┐рдЪ (рдЪрд░рдг <-> рдареЗрд╕) рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВред рд╣рдо рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ ...
рдЗрд╕рдореЗрдВ рдХреБрдЫ рдорд┐рдирдЯ рд▓рдЧрддреЗ рд╣реИрдВ, рдЙрдбрд╝рд╛рди рд╕реНрдерд┐рд░ рд╣реИред рдХреНрдпреВрдП рдЗрдВрдЬреАрдирд┐рдпрд░ рдПрдХ рдзреВрдореНрд░рдкрд╛рди рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ, рдиреЛрдЯрд┐рд╕ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрд╡реЗрджрди рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЕрд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдзреАрдорд╛ рд╣реИред рд╣рдо рдХреИрд╢ рдХреЛ рдЧрд░реНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрддреЗ рд╣реИрдВред
рдХреБрдЫ рдорд┐рдирдЯ рдмреАрдд рдЬрд╛рддреЗ рд╣реИрдВ, рдкрд╣рд▓реА рд╢рд┐рдХрд╛рдпрдд рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рд╕реЗ рд╣реЛрддреА рд╣реИ: рдбреЗрдЯрд╛ рдХреЛ рдЧреНрд░рд╛рд╣рдХреЛрдВ рд╕реЗ рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдзреАрдорд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╡рд╛рдм рджреЗрдиреЗ рдореЗрдВ рд▓рдВрдмрд╛ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рдЖрджрд┐ред рд╣рдореЗрдВ рдЪрд┐рдВрддрд╛ рд╣реЛрдиреЗ рд▓рдЧрддреА рд╣реИ ... рд╣рдо рд▓реЙрдЧ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рд╣рдо рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░рдгреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВред
рдХреБрдЫ рдорд┐рдирдЯреЛрдВ рдХреЗ рдмрд╛рдж, рдбреАрдмреА рдкреНрд░рд╡реЗрд╢ рд╕реЗ рдПрдХ рдкрддреНрд░ рдЖрддрд╛ рд╣реИред рд╡реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп (рдмрд╛рдж рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд) рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╕реАрдорд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЯреВрдЯ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЕрдирдВрдд рдХреЛ рдЬрд╛рддрд╛ рд╣реИред
рдореИрдВ рдирд┐рдЧрд░рд╛рдиреА
рд░рдЦрддрд╛ рд╣реВрдВ (рдореИрдВ
JavaMelody рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛
рд╣реВрдВ ), рдореБрдЭреЗ рдпреЗ рдЕрдиреБрд░реЛрдз рдорд┐рд▓рддреЗ рд╣реИрдВред рдореИрдВ рдкреАрдЬреАрдбреАрдорд┐рди рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВ рдкреБрди: рдкреЗрд╢ рдХрд░рддрд╛ рд╣реВрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдВрдмрд╛ рд╣реИред рдореИрдВ "рд╡реНрдпрд╛рдЦреНрдпрд╛" рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ, рдореИрдВ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛ рдХреЛ рджреЗрдЦрддрд╛ рд╣реВрдВ ... рдпрд╣ рд╣реИ, рд╣рдо рдЕрдиреБрдХреНрд░рдорд┐рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЧрдПред
рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛ рдкрд░реНрдпрд╛рдкреНрдд рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ?
рдЙрд╕ рдШрдЯрдирд╛ рдиреЗ рдореБрдЭреЗ рдмрд╣реБрдд рдХреБрдЫ рд╕рд┐рдЦрд╛рдпрд╛ред рд╣рд╛рдВ, рдореИрдВрдиреЗ рдПрдХ рдШрдВрдЯреЗ рдХреЗ рд▓рд┐рдП "рдЖрдЧ рдХреЛ рдмреБрдЭрд╛рдпрд╛", рд╕реАрдзреЗ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдареЗрд╕ рдкрд░ рд╕рд╣реА рд╕реВрдЪрдХрд╛рдВрдХ рдмрдирд╛рдирд╛ (CONCURRENTLY рд╡рд┐рдХрд▓реНрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛):
CREATE INDEX CONCURRENTLY IF NOT EXISTS ix_pets_name ON pets_table (name_column);
рд╕рд╣рдордд, рдпрд╣ рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдХреЗ рд╕рд╛рде рдПрдХ рддреИрдирд╛рддреА рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдерд╛ред рдореИрдВ рдЬрд┐рд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЙрд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред
рдореИрдВрдиреЗ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рд╛ рдФрд░ рдХреЛрдб рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдЪреЗрдХрд▓рд┐рд╕реНрдЯ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдмреЛрд▓реНрдб рдкреЙрдЗрдВрдЯ рдЬреЛрдбрд╝рд╛: рдпрджрд┐ рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ / рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ - рдореИрдВ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП sql рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рд╡рд╣рд╛рдВ рд╕реВрдЪрдХрд╛рдВрдХ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдмрджрд▓рддрд╛ рд╣реИред рдпрджрд┐ рд╡рд╣ рдирд╣реАрдВ рд╣реИ, рддреЛ рдореИрдВ рд▓реЗрдЦрдХ рдХреЛ рдПрдХ рдкреНрд░рд╢реНрди рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ: рдХреНрдпрд╛ рд╡рд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ?
рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдереЛрдбрд╝рд╛ рдбреЗрдЯрд╛ рд╣реЛрдиреЗ рдкрд░ рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓рд╛рдЦреЛрдВ рдореЗрдВ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рддреНрд░реБрдЯрд┐ рдШрд╛рддрдХ рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХрд╣рд╛рдиреА рд╕реЗрдЯ рд╣реЛ рд╕рдХрддреА рд╣реИред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓реЗрдЦрдХ (рдмрд╛рдж рдореЗрдВ рдкреАрдЖрд░) рдХреЛ 100% рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЙрд╕рдиреЗ рдПрдЪрдХреНрдпреВрдПрд▓ рдореЗрдВ рдЬреЛ рдкреНрд░рд╢реНрди рд▓рд┐рдЦрд╛ рд╣реИ рд╡рд╣ рдХрдо рд╕реЗ рдХрдо рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╕реВрдЪрдХрд╛рдВрдХ (рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрдХреИрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдбреЗрд╡рд▓рдкрд░:
- рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ
- рд▓реЙрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд (HQL -> SQL) рдХреНрд╡реЗрд░реА рдХреА рддрд▓рд╛рд╢ рд╣реИ
- PGAdmin рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рдбреЗрдЯрд╛рдмреЗрд╕ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдЙрдкрдХрд░рдг рдЦреЛрд▓рддрд╛ рд╣реИ
- рд╕реНрдерд╛рдиреАрдп рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рдХреЛ рднреА рдЕрдкрдиреЗ рдкреНрд░рдпреЛрдЧреЛрдВ рд╕реЗ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ, рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХрд╛рд░реНрдп рдбреЗрдЯрд╛ рдХреА рдПрдХ рд░рд╛рд╢рд┐ (рдиреНрдпреВрдирддрдо 10K - 10KK)
- рдЕрдиреБрд░реЛрдз рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ
- рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ
- рдзреНрдпрд╛рди рд╕реЗ рдЗрд╕рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдЪрд┐рдд рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ
- рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рдЬреЛрдбрд╝рддрд╛ / рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛ рдЗрд╕реЗ рд╕реВрдЯ рдХрд░рддреА рд╣реИ
- рдкреАрдЖрд░ рдореЗрдВ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ
- рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдЬреЛрдЦрд┐рдореЛрдВ рдФрд░ рдЕрдиреБрд░реЛрдз рдХреА рдЧрдВрднреАрд░рддрд╛ рдХрд╛ рдЖрдХрд▓рди рдХрд░рддреЗ рд╣реБрдП, рдореИрдВ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рджреЛрдмрд╛рд░рд╛ рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ
рдмрд╣реБрдд рд╕реА рдирд┐рдпрдорд┐рдд рдХреНрд░рд┐рдпрд╛рдПрдВ рдФрд░ рдорд╛рдирд╡реАрдп рдХрд╛рд░рдХ, рд▓реЗрдХрд┐рди рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдореИрдВ рд╕рдВрддреБрд╖реНрдЯ рдерд╛, рдФрд░ рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рд░рд╣рддрд╛ рдерд╛ред
рдШрд░ рдХреЗ рд░рд╛рд╕реНрддреЗ рдкрд░
рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рд╕рдВрдЧреАрдд / рдкреЙрдбрдХрд╛рд╕реНрдЯ рд╕реБрдиреЗ рдмрд┐рдирд╛ рдХрд╛рдо рд╕реЗ рдЬрд╛рдирд╛ рдХрднреА-рдХрднреА рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рд╕рдордп, рдХреЗрд╡рд▓ рдЬреАрд╡рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдХрд░, рдЖрдк рджрд┐рд▓рдЪрд╕реНрдк рдирд┐рд╖реНрдХрд░реНрд╖ рдФрд░ рд╡рд┐рдЪрд╛рд░реЛрдВ рдкрд░ рдЖ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рджрд┐рди рдореИрдВ рдШрд░ рдЪрд▓рд╛ рдЧрдпрд╛ рдФрд░ рд╕реЛрдЪрд╛ рдХрд┐ рдЙрд╕ рджрд┐рди рдХреНрдпрд╛ рд╣реБрдЖ рдерд╛ред рдХреБрдЫ рд╕рдореАрдХреНрд╖рд╛ рд╣реБрдИ, рдореИрдВрдиреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдПрдХ рдЪреЗрдХрд▓рд┐рд╕реНрдЯ рдХреЗ рд╕рд╛рде рдЬрд╛рдБрдЪ рдХреА рдФрд░ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреАред рдореИрдВ рдЙрд╕ рд╕рдордп рдЗрддрдирд╛ рдердХ рдЧрдпрд╛, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛, рдпрд╣ рдХреНрдпрд╛ рдореБрд╕реАрдмрдд рд╣реИ? рдХреНрдпрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ? .. рдореИрдВрдиреЗ рдПрдХ рддреНрд╡рд░рд┐рдд рдХрджрдо рдЙрдард╛рдпрд╛, рдЬрд▓реНрджреА рд╕реЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ "рдХрдЯ" рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред
рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди
рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛ рдореЗрдВ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрдпрд╛ рд╣реИ?
рдмреЗрд╢рдХ, рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдкрд░ seq рд╕реНрдХреИрдиред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдерд╛ рдХрд┐:
- рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рдареЗрд╕ рдХреЗ рд╕рдорд╛рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛
- рдПрдХ JPA рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА (рд╣рд╛рдЗрдмрд░рдиреЗрдЯ) рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреНрд╡реЗрд░реА рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ
- рдпрд╣ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ
- Parsit рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛, рдЗрд╕реЗ рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд░рдЦрдирд╛
- рдореБрдЦрд░ рддрд░реАрдХреЛрдВ рдХрд╛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрд╕ seq рд╕реНрдХреИрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдмрдирд╛рдХрд░ рдЗрд╕ рдкрд░рд┐рдХрд▓реНрдкрдирд╛ рдХрд╛ рдЬрд▓реНрдж рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред
рд╕рдорд╛рдзрд╛рди рд╡рд╛рд╕реНрддреБрдХрд▓рд╛

рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рдЬрд┐рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛, рд╡рд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдкреНрд░рдХреНрд╖реЗрдкрдг рдерд╛ рдЬреЛ рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рдареЗрд╕ рдкрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред
Docker & TestContainers рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╡реЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВред
SqlInterceptor, ExecutionPlanQuery, ExecutionPlanParse, рдФрд░ AssertService рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИ рдХрд┐ рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ Postgres рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИред рдЕрдиреНрдп рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИред рдпрджрд┐ рдЖрдк рднрд╛рдЧ рд▓реЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рд╕реНрд╡рд╛рдЧрдд рд╣реИред рдХреЛрдб рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИред
рдпрд╣ рд╕рдм рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рде
рдЧрд┐рдЯрд╣рдм рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдФрд░
рдЪреЗрдХрдЗрдирдХреНрд╕-рдпреВрдЯрд┐рд▓реНрд╕ рдХрд╣рд╛ред рдЖрдкрдХреЛ рдЗрд╕реЗ рджреЛрд╣рд░рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдмрд╕ рдорд╛рд╡реЗрди / рдЧреНрд░реЗрдбрд▓ рдореЗрдВ рдЪреЗрдХрдЗрдирдХреНрд╕ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдРрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдРрд╕рд╛ рдХреИрд╕реЗ рдХрд░реЗрдВ, рдореИрдВ рдиреАрдЪреЗ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред
CheckInx рдШрдЯрдХреЛрдВ рдХреА рдмрд╛рддрдЪреАрдд рдХрд╛ рд╡рд┐рд╡рд░рдг
ProxyDataSource
рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рдЬрд┐рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛, рд╡рд╣ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЕрд╡рд░реЛрдзрди рдерд╛ред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд╛рдкрд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде, рдмрд┐рдирд╛ рдкреНрд░рд╢реНрди рдХреЗ, рдЖрджрд┐ред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░реЙрдХреНрд╕реА рдореЗрдВ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрди рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдЙрдиреНрд╣реЗрдВ рдЕрд╡рд░реЛрдзрди рдХрд░реЗрдЧрд╛ред
рдЗрд╕ рддрд░рд╣ рдХреЗ ProxyDataSource рдХреЛ рдХрдИ рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рд╣реА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред рдореИрдВрдиреЗ рд░реЗрдбреА-рдореЗрдб
рдЯреИрдЯрдбреА рд╕реЙрд▓реНрдпреВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬреЛ рдореБрдЭреЗ рдореЗрд░реА рдЬрд╝рд░реВрд░рдд рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдкрдиреЗ рд╢реНрд░реЛрддрд╛ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдореИрдВ DataSourceWrapper (рдмреАрдирдкреЛрд╕реНрдЯрдкреНрд░реЛрд╕реЗрд╕рд░) рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реВрдВред
SqlInterceptor
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕рдХреА рд╢реБрд░реБрдЖрдд () рд╡рд┐рдзрд┐ рдЕрдкрдиреЗ рд╢реНрд░реЛрддрд╛ рдХреЛ рдкреНрд░реЙрдХреНрд╕реАрдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдореЗрдВ рд╕реЗрдЯ рдХрд░рддреА рд╣реИ рдФрд░ рдЖрдВрддрд░рд┐рдХ рдбреЗрдЯрд╛ рд╕реВрдЪреА рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реБрдП рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд░реЛрдХрдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддреА рд╣реИред рдХреНрд░рдорд╢рдГ рд╕реНрдЯреЙрдк () рд╡рд┐рдзрд┐, рд╕реНрдерд╛рдкрд┐рдд рд╢реНрд░реЛрддрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрддреА рд╣реИред
ExecutionPlanQuery
рдпрд╣рд╛рдВ, рдореВрд▓ рдЕрдиреБрд░реЛрдз рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдореЗрдВ рддрдмреНрджреАрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред Postgres рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдХреНрд╡реЗрд░реА рдХреАрд╡рд░реНрдб "EXPLAIN" рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдХреНрд╡реЗрд░реА рдХреЛ рдЯреЗрд╕реНрдЯрдХрдиреЗрдХреНрдЯрд░реНрд╕ рд╕реЗ рдПрдХ рд╣реА рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ "рд░реЙ" рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛ (рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕реВрдЪреА) рд╡рд╛рдкрд╕ рдХрд░ рджреА рдЬрд╛рддреА рд╣реИред
ExecutionPlanParser
рдХрдЪреНрдЪреЗ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЗрд╕реЗ рдПрдХ рдкреЗрдбрд╝ рдореЗрдВ рдиреЛрдбреНрд╕ (рдкреНрд▓рд╛рдирдиреЛрдб) рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реВрдВред
рдЖрдЗрдП рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирд┐рд╖реНрдкрд╛рджрдирдкреНрд▓рд╛рди рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП PlanNode рдлрд╝реАрд▓реНрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ:
Index Scan using ix_pets_age on pets (cost=0.29..8.77 rows=1 width=36) Index Cond: (age < 10) Filter: ((name)::text = 'Jack'::text)
AssertService
рдкрд╛рд░реНрд╕рд░ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрднрд╡ рд╣реИред CheckInxAssertService, рдКрдкрд░ рд╡рд░реНрдгрд┐рдд PlanNode рдЯреНрд░реА рдХреЗ рдЪреЗрдХ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд▓реИрдВрдмрдбрд╛рд╕ рд╕реЗрдЯ рдХрд░рдиреЗ рдпрд╛ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╡рд╛рд▓реЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддрд╛рдХрд┐ рдЖрдкрдХреА рдХреНрд╡реЗрд░реА рдореЗрдВ Seq рд╕реНрдХреИрди рди рд╣реЛ, рдпрд╛ рдЖрдк рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ / рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
CoverageLevel
рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг Enum, рдореИрдВ рдЗрд╕реЗ рдЕрд▓рдЧ рд╕реЗ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛:
рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдХреБрдЫ рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред
CheckInx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреЗрд╕реНрдЯ рдЙрджрд╛рд╣рд░рдг
рдореИрдВрдиреЗ
рдЧрд┐рдЯрд╣рдм рдЪреЗрдХрдЗрдирдХреНрд╕-рдбреЗрдореЛ рдкрд░ рдПрдХ рдЕрд▓рдЧ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд┐рдпрд╛, рдЬрд╣рд╛рдВ рдореИрдВрдиреЗ рдкрд╛рд▓рддреВ рдЬрд╛рдирд╡рд░реЛрдВ рдХреА рдореЗрдЬ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬреЗрдкреАрдП рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдЪреЗрдХрд┐рдВрдЧ рдХрд╡рд░реЗрдЬ, рдЗрдВрдбреЗрдХреНрд╕ рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХрд┐рдПред рд╡рд╣рд╛рдВ рдПрдХ рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред
рдЖрдк рдЗрд╕ рддрд░рд╣ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
@Test fun testFindByLocation() {
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпреЛрдЬрдирд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛ рд╕рдХрддреА рд╣реИ:
Index Scan using ix_pets_location on pets pet0_ (cost=0.29..4.30 rows=1 width=46) Index Cond: ((location)::text = 'Moscow'::text)
... рдпрд╛ рдЗрд╕ рддрд░рд╣ рдЕрдЧрд░ рд╣рдо рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЧрдП (рдкрд░реАрдХреНрд╖рдг рд▓рд╛рд▓ рд╣реЛ рдЧрдП):
Seq Scan on pets pet0_ (cost=0.00..19.00 rows=4 width=84) Filter: ((location)::text = 'Moscow'::text)
рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдореИрдВ рдЬреНрдпрд╛рджрд╛рддрд░ рд╕рд░рд▓рддрдо рдореБрдЦрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛ рдореЗрдВ рдХреЛрдИ Seq рд╕реНрдХреИрди рдирд╣реАрдВ рд╣реИ:
checkInxAssertService.assertCoverage(CoverageLevel.HALF, sqlInterceptor.statements[0])
рдРрд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХрдо рд╕реЗ рдХрдо, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпреЛрдЬрдирд╛ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ред
рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкреНрд░рдмрдВрдзрди рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреЛрдб рдХреА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдФрд░ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рдирд╢реАрд▓рддрд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИред
рдЕрдиреБрднрд╡реА рдореЛрдбрдореИрдВ CheckInxAssertService рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЖрдк рдЦреБрдж рдХреЛ рдкрд╛рд░реНрд╕ рдХрд┐рдП рдЧрдП рдкреЗрдбрд╝ (ExecutionPlanParser) рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХрдЪреНрдЪреЗ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛ (рдПрдХреНрдЬрд╝реАрдХреНрдпреВрд╢рди рдХреНрд▓реАрдиреАрдХрд╛рдо рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо) рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
@Test fun testFindByLocation() {
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрд╢рди
рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдореИрдВрдиреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╕рдореВрд╣ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛, рдЗрд╕реЗ рдЧрд╣рди рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рдХрд╣рд╛ред
рдЪреЗрдХреНрд╕рд┐рдВрдХреНрд╕-рдмрд░реНрддрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рдФрд░ рд╢реБрд░реВ рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИред рдЪрд▓реЛ рдирд┐рд░реНрдорд╛рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рдкрд╣рд▓реЗ рднрдВрдбрд╛рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред рдХрд┐рд╕реА рджрд┐рди рдореИрдВ рдЪреЗрдХрдЗрдирдХреНрд╕ рдХреЛ рдорд╛рд╡реЗрди рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░ рджреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдм рдЖрдк рдЬреАрдЯрд╣рдм рд╕реЗ рдХреЗрд╡рд▓ рдЬреАрдЯрдкреИрдХ рдХреЗ рдЬрд░рд┐рдП рд╣реА рдЖрд░реНрдЯрд╡рд░реНрдХ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
repositories { // ... maven { url 'https://jitpack.io' } }
рдЕрдЧрд▓рд╛, рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝реЗрдВ:
dependencies { // ... implementation 'com.github.tinkoffcreditsystems:checkinx-utils:0.2.0' }
рд╣рдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдХрдиреЗрдХреНрд╢рди рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЗрд╡рд▓ рдкреЛрд╕реНрдЯрдЧреНрд░реИрдЬ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
@Profile("test") @ImportAutoConfiguration(classes = [PostgresConfig::class]) @Configuration open class CheckInxConfig
рдЯреЗрд╕реНрдЯ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдЕрдиреНрдпрдерд╛, рдЖрдк рдЕрдкрдиреЗ рдЙрддреНрдкрд╛рджреЛрдВ рдореЗрдВ ProxyDataSource рдкрд╛рдПрдВрдЧреЗред
PostgresConfig рдХрдИ рд╕реЗрдо рдЬреЛрдбрд╝рддрд╛ рд╣реИ:
- DataSourceWrapper
- PostgresInterceptor
- PostgresExecutionPlanParser
- PostgresExecutionPlanQuery
- CheckInxAssertServiceImpl
рдпрджрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдк рд╣рдореЗрд╢рд╛ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдмреАрди рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдЬреНрдЮрд╛рдд рдореБрджреНрджреЗ
рдХрднреА-рдХрднреА рдПрдХ DataSourceWrapper рдореВрд▓ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ CGLIB рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рдХрд╛рд░рдг рдмрджрд▓рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ DataSource рдмреАрдирдкреЛрд╕реНрдЯрдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди ScopedProxyFactoryBean рдФрд░ рдЯрд╛рдЗрдк рдЪреЗрдХрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред
рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╕рдорд╛рдзрд╛рди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ HikariDataSource рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рддрдм рдЖрдкрдХрд╛ рд╡рд┐рдиреНрдпрд╛рд╕ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:
@Profile("test") @ImportAutoConfiguration(classes = [PostgresConfig::class]) @Configuration open class CheckInxConfig { @Primary @Bean @ConfigurationProperties("spring.datasource") open fun dataSource(): DataSource { return DataSourceBuilder.create() .type(HikariDataSource::class.<i>java</i>) .build() } @Bean @ConfigurationProperties("spring.datasource.configuration") open fun dataSource(properties: DataSourceProperties): HikariDataSource { return properties.initializeDataSourceBuilder() .type(HikariDataSource::class.<i>java</i>) .build() } }
рд╡рд┐рдХрд╛рд╕ рдХреА рдпреЛрдЬрдирд╛рдПрдБ
- рдореИрдВ рдпрд╣ рд╕рдордЭрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдореЗрд░реЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдмрдирд╛рдПрдВред рдореБрдЭреЗ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред
- рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЬрд░реВрд░рдд рд╣реИ рдФрд░ рдореБрдЦрд░ рддрд░реАрдХреЛрдВ рдХреА рдорд╛рдирдХ рд╕реВрдЪреА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВред
- рдЕрдиреНрдп рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦреЗрдВред
- SqlInterceptor.statements [0] рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ, рдореИрдВ рдЗрд╕реЗ рд╕реБрдзрд╛рд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреА рдХрд┐ рдЕрдЧрд░ рдХреЛрдИ рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рдЕрднреНрдпрд╛рд╕ рдХрд░рдХреЗ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдХреНрд░реЗрдбрд┐рдЯ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╣реЛрдВрдЧреА:
рдпрд╣ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдХреНрд╡реЗрд░реА рдкреНрд▓рд╛рдирд░ рдХреИрд╕реЗ рдареЗрд╕ рдкрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛, рдпрд╣ рд╕рдм рдПрдХрддреНрд░рд┐рдд рдЖрдВрдХрдбрд╝реЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ ред
рджрд░рдЕрд╕рд▓, рдПрдХ рдпреЛрдЬрдирд╛рдХрд╛рд░ред рдкрд╣рд▓реЗ рдПрдХрддреНрд░ рдХрд┐рдП рдЧрдП рдЖрдБрдХрдбрд╝реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╕реЗ рдЕрд▓рдЧ рдПрдХ рдпреЛрдЬрдирд╛ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрд░реНрде рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИред
рдпреЛрдЬрдирд╛рдХрд╛рд░ рдХрд╛ рдХрд╛рд░реНрдп рд╕реБрдзрд╛рд░ рдХрд░рдирд╛ рд╣реИ, рдмрд┐рдЧрдбрд╝рдирд╛ рдирд╣реАрдВ, рдЕрдиреБрд░реЛрдзред рдЗрд╕рд▓рд┐рдП, рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдг рдХреЗ, рд╡рд╣ рдЕрдЪрд╛рдирдХ рд╕реЗрдХ рд╕реНрдХреИрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдк рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдкрдХреЛ CheckInx рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╕рдордп, рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ рдФрд░ рд╕реВрдЪрдХрд╛рдВрдХ рдмрдирд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдПрдВ рдХрд┐ рдпрд╣рд╛рдВ рдХрд┐рд╕реА рднреА рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЖрдк Seq рд╕реНрдХреИрди рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рд╣реИрдВред рдпрд╣ рдЖрдкрдХреЛ рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛ рдкрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдкреНрд░рд╢реНрди рдХрд░рдиреЗ рд╕реЗ рдмрдЪрд╛рдПрдЧрд╛ред
рд╕рдВрджрд░реНрдн
- https://github.com/TinkoffCreditSystems/checkinx-utils
- https://github.com/dsemyriazhko/checkinx-demo
- https://github.com/ttddyy/datasource-proxy
- https://mvnrepository.com/artifact/org.testcontainers/postgresql
- https://github.com/javamelody/javamelody/wiki