рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓рдиреЗ рдХреЛ рдХреИрд╕реЗ рд░реЛрдХреЗрдВ рдФрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛ рдХреА рдЬрд╛рдВрдЪ рд╢реБрд░реВ рдХрд░реЗрдВ

kdpv

рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ, рдПрдХ рдЕрдкреНрд░рд┐рдп рдХрд╣рд╛рдиреА рдореЗрд░реЗ рд╕рд╛рде рдШрдЯрд┐рдд рд╣реБрдИ, рдЬрд┐рд╕рдиреЗ рдПрдХ рдЧреАрдереВрдм рдкрд░ рдПрдХ рдЫреЛрдЯреА рд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреНрд░рд┐рдЧрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реБрдЖред

рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рджрд┐рди, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд░рд┐рд▓реАрдЬ: рд╣рдорд╛рд░реЗ рдХреНрдпреВрдП рдЗрдВрдЬреАрдирд┐рдпрд░ рджреНрд╡рд╛рд░рд╛ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдКрдкрд░ рдФрд░ рдиреАрдЪреЗ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд╡рд┐рддреНрд░ рдЧрд╛рдп рдХреА рд╢рд╛рдВрддрд┐ рдХреЗ рд╕рд╛рде рд╣рдо рдордВрдЪ рдкрд░ "рд░реЛрд▓" рдХрд░рддреЗ рд╣реИрдВред рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЕрдЪреНрдЫрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЙрдЧ рдореЗрдВ - рдореМрдиред рд╣рдо рд╕реНрд╡рд┐рдЪ (рдЪрд░рдг <-> рдареЗрд╕) рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВред рд╣рдо рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ ...

рдЗрд╕рдореЗрдВ рдХреБрдЫ рдорд┐рдирдЯ рд▓рдЧрддреЗ рд╣реИрдВ, рдЙрдбрд╝рд╛рди рд╕реНрдерд┐рд░ рд╣реИред рдХреНрдпреВрдП рдЗрдВрдЬреАрдирд┐рдпрд░ рдПрдХ рдзреВрдореНрд░рдкрд╛рди рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ, рдиреЛрдЯрд┐рд╕ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрд╡реЗрджрди рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЕрд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдзреАрдорд╛ рд╣реИред рд╣рдо рдХреИрд╢ рдХреЛ рдЧрд░реНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрддреЗ рд╣реИрдВред

рдХреБрдЫ рдорд┐рдирдЯ рдмреАрдд рдЬрд╛рддреЗ рд╣реИрдВ, рдкрд╣рд▓реА рд╢рд┐рдХрд╛рдпрдд рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рд╕реЗ рд╣реЛрддреА рд╣реИ: рдбреЗрдЯрд╛ рдХреЛ рдЧреНрд░рд╛рд╣рдХреЛрдВ рд╕реЗ рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдзреАрдорд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╡рд╛рдм рджреЗрдиреЗ рдореЗрдВ рд▓рдВрдмрд╛ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рдЖрджрд┐ред рд╣рдореЗрдВ рдЪрд┐рдВрддрд╛ рд╣реЛрдиреЗ рд▓рдЧрддреА рд╣реИ ... рд╣рдо рд▓реЙрдЧ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рд╣рдо рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░рдгреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВред

рдХреБрдЫ рдорд┐рдирдЯреЛрдВ рдХреЗ рдмрд╛рдж, рдбреАрдмреА рдкреНрд░рд╡реЗрд╢ рд╕реЗ рдПрдХ рдкрддреНрд░ рдЖрддрд╛ рд╣реИред рд╡реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп (рдмрд╛рдж рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд) рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╕реАрдорд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЯреВрдЯ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЕрдирдВрдд рдХреЛ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВ рдирд┐рдЧрд░рд╛рдиреА рд░рдЦрддрд╛ рд╣реВрдВ (рдореИрдВ JavaMelody рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ ), рдореБрдЭреЗ рдпреЗ рдЕрдиреБрд░реЛрдз рдорд┐рд▓рддреЗ рд╣реИрдВред рдореИрдВ рдкреАрдЬреАрдбреАрдорд┐рди рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВ рдкреБрди: рдкреЗрд╢ рдХрд░рддрд╛ рд╣реВрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдВрдмрд╛ рд╣реИред рдореИрдВ "рд╡реНрдпрд╛рдЦреНрдпрд╛" рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ, рдореИрдВ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛ рдХреЛ рджреЗрдЦрддрд╛ рд╣реВрдВ ... рдпрд╣ рд╣реИ, рд╣рдо рдЕрдиреБрдХреНрд░рдорд┐рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЧрдПред

рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛ рдкрд░реНрдпрд╛рдкреНрдд рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ?


рдЙрд╕ рдШрдЯрдирд╛ рдиреЗ рдореБрдЭреЗ рдмрд╣реБрдд рдХреБрдЫ рд╕рд┐рдЦрд╛рдпрд╛ред рд╣рд╛рдВ, рдореИрдВрдиреЗ рдПрдХ рдШрдВрдЯреЗ рдХреЗ рд▓рд┐рдП "рдЖрдЧ рдХреЛ рдмреБрдЭрд╛рдпрд╛", рд╕реАрдзреЗ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдареЗрд╕ рдкрд░ рд╕рд╣реА рд╕реВрдЪрдХрд╛рдВрдХ рдмрдирд╛рдирд╛ (CONCURRENTLY рд╡рд┐рдХрд▓реНрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛):

CREATE INDEX CONCURRENTLY IF NOT EXISTS ix_pets_name ON pets_table (name_column); 

рд╕рд╣рдордд, рдпрд╣ рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдХреЗ рд╕рд╛рде рдПрдХ рддреИрдирд╛рддреА рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдерд╛ред рдореИрдВ рдЬрд┐рд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЙрд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред

рдореИрдВрдиреЗ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рд╛ рдФрд░ рдХреЛрдб рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдЪреЗрдХрд▓рд┐рд╕реНрдЯ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдмреЛрд▓реНрдб рдкреЙрдЗрдВрдЯ рдЬреЛрдбрд╝рд╛: рдпрджрд┐ рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ / рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ - рдореИрдВ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП sql рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рд╡рд╣рд╛рдВ рд╕реВрдЪрдХрд╛рдВрдХ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдмрджрд▓рддрд╛ рд╣реИред рдпрджрд┐ рд╡рд╣ рдирд╣реАрдВ рд╣реИ, рддреЛ рдореИрдВ рд▓реЗрдЦрдХ рдХреЛ рдПрдХ рдкреНрд░рд╢реНрди рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ: рдХреНрдпрд╛ рд╡рд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ?

рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдереЛрдбрд╝рд╛ рдбреЗрдЯрд╛ рд╣реЛрдиреЗ рдкрд░ рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓рд╛рдЦреЛрдВ рдореЗрдВ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рддреНрд░реБрдЯрд┐ рдШрд╛рддрдХ рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХрд╣рд╛рдиреА рд╕реЗрдЯ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓реЗрдЦрдХ (рдмрд╛рдж рдореЗрдВ рдкреАрдЖрд░) рдХреЛ 100% рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЙрд╕рдиреЗ рдПрдЪрдХреНрдпреВрдПрд▓ рдореЗрдВ рдЬреЛ рдкреНрд░рд╢реНрди рд▓рд┐рдЦрд╛ рд╣реИ рд╡рд╣ рдХрдо рд╕реЗ рдХрдо рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╕реВрдЪрдХрд╛рдВрдХ (рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрдХреИрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдбреЗрд╡рд▓рдкрд░:

  1. рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ
  2. рд▓реЙрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд (HQL -> SQL) рдХреНрд╡реЗрд░реА рдХреА рддрд▓рд╛рд╢ рд╣реИ
  3. PGAdmin рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рдбреЗрдЯрд╛рдмреЗрд╕ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдЙрдкрдХрд░рдг рдЦреЛрд▓рддрд╛ рд╣реИ
  4. рд╕реНрдерд╛рдиреАрдп рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рдХреЛ рднреА рдЕрдкрдиреЗ рдкреНрд░рдпреЛрдЧреЛрдВ рд╕реЗ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ, рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХрд╛рд░реНрдп рдбреЗрдЯрд╛ рдХреА рдПрдХ рд░рд╛рд╢рд┐ (рдиреНрдпреВрдирддрдо 10K - 10KK)
  5. рдЕрдиреБрд░реЛрдз рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ
  6. рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ
  7. рдзреНрдпрд╛рди рд╕реЗ рдЗрд╕рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдЪрд┐рдд рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ
  8. рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рдЬреЛрдбрд╝рддрд╛ / рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛ рдЗрд╕реЗ рд╕реВрдЯ рдХрд░рддреА рд╣реИ
  9. рдкреАрдЖрд░ рдореЗрдВ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ
  10. рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдЬреЛрдЦрд┐рдореЛрдВ рдФрд░ рдЕрдиреБрд░реЛрдз рдХреА рдЧрдВрднреАрд░рддрд╛ рдХрд╛ рдЖрдХрд▓рди рдХрд░рддреЗ рд╣реБрдП, рдореИрдВ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рджреЛрдмрд╛рд░рд╛ рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ

рдмрд╣реБрдд рд╕реА рдирд┐рдпрдорд┐рдд рдХреНрд░рд┐рдпрд╛рдПрдВ рдФрд░ рдорд╛рдирд╡реАрдп рдХрд╛рд░рдХ, рд▓реЗрдХрд┐рди рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдореИрдВ рд╕рдВрддреБрд╖реНрдЯ рдерд╛, рдФрд░ рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рд░рд╣рддрд╛ рдерд╛ред

рдШрд░ рдХреЗ рд░рд╛рд╕реНрддреЗ рдкрд░


рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рд╕рдВрдЧреАрдд / рдкреЙрдбрдХрд╛рд╕реНрдЯ рд╕реБрдиреЗ рдмрд┐рдирд╛ рдХрд╛рдо рд╕реЗ рдЬрд╛рдирд╛ рдХрднреА-рдХрднреА рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рд╕рдордп, рдХреЗрд╡рд▓ рдЬреАрд╡рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдХрд░, рдЖрдк рджрд┐рд▓рдЪрд╕реНрдк рдирд┐рд╖реНрдХрд░реНрд╖ рдФрд░ рд╡рд┐рдЪрд╛рд░реЛрдВ рдкрд░ рдЖ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рджрд┐рди рдореИрдВ рдШрд░ рдЪрд▓рд╛ рдЧрдпрд╛ рдФрд░ рд╕реЛрдЪрд╛ рдХрд┐ рдЙрд╕ рджрд┐рди рдХреНрдпрд╛ рд╣реБрдЖ рдерд╛ред рдХреБрдЫ рд╕рдореАрдХреНрд╖рд╛ рд╣реБрдИ, рдореИрдВрдиреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдПрдХ рдЪреЗрдХрд▓рд┐рд╕реНрдЯ рдХреЗ рд╕рд╛рде рдЬрд╛рдБрдЪ рдХреА рдФрд░ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреАред рдореИрдВ рдЙрд╕ рд╕рдордп рдЗрддрдирд╛ рдердХ рдЧрдпрд╛, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛, рдпрд╣ рдХреНрдпрд╛ рдореБрд╕реАрдмрдд рд╣реИ? рдХреНрдпрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ? .. рдореИрдВрдиреЗ рдПрдХ рддреНрд╡рд░рд┐рдд рдХрджрдо рдЙрдард╛рдпрд╛, рдЬрд▓реНрджреА рд╕реЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ "рдХрдЯ" рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди


рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛ рдореЗрдВ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрдпрд╛ рд╣реИ?
рдмреЗрд╢рдХ, рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдкрд░ seq рд╕реНрдХреИрдиред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдерд╛ рдХрд┐:

  1. рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рдареЗрд╕ рдХреЗ рд╕рдорд╛рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛
  2. рдПрдХ JPA рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА (рд╣рд╛рдЗрдмрд░рдиреЗрдЯ) рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреНрд╡реЗрд░реА рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ
  3. рдпрд╣ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ
  4. Parsit рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛, рдЗрд╕реЗ рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд░рдЦрдирд╛
  5. рдореБрдЦрд░ рддрд░реАрдХреЛрдВ рдХрд╛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрд╕ seq рд╕реНрдХреИрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдмрдирд╛рдХрд░ рдЗрд╕ рдкрд░рд┐рдХрд▓реНрдкрдирд╛ рдХрд╛ рдЬрд▓реНрдж рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред

рд╕рдорд╛рдзрд╛рди рд╡рд╛рд╕реНрддреБрдХрд▓рд╛


checkinx рд╡рд╛рд╕реНрддреБрдХрд▓рд╛

рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рдЬрд┐рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛, рд╡рд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдкреНрд░рдХреНрд╖реЗрдкрдг рдерд╛ рдЬреЛ рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рдареЗрд╕ рдкрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред

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) 

рд╕рдВрдкрддреНрддрд┐рдЙрджрд╛рд╣рд░рдгрд╡рд┐рд╡рд░рдг
рдХрдЪреНрдЪрд╛: рд╕реНрдЯреНрд░рд┐рдВрдЧрдкрд╛рд▓рддреВ рдЬрд╛рдирд╡рд░реЛрдВ рдкрд░ ix_pets_age рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрдХреИрди (рд▓рд╛рдЧрдд = 0.29..8.77 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1 рдЪреМрдбрд╝рд╛рдИ = 36)рд╕реНрд░реЛрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ
рддрд╛рд▓рд┐рдХрд╛: рд╕реНрдЯреНрд░рд┐рдВрдЧ?рдкрд╛рд▓рддреВ рдЬрд╛рдирд╡рд░
рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдирд╛рдо
рд▓рдХреНрд╖реНрдп: рд╕реНрдЯреНрд░рд┐рдВрдЧ?ix_pets_ageрд╕реВрдЪрдХрд╛рдВрдХ рдирд╛рдо
рдХрд╡рд░реЗрдЬ: рд╕реНрдЯреНрд░рд┐рдВрдЧ?рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрдХреИрдирдХрд╡рд░реЗрдЬ
coverageLevelрдЖрдзрд╛рдХреЛрдЯрд┐рдВрдЧ рдЕрдореВрд░реНрдд (ZERO, HALF, FULL)
рдмрдЪреНрдЪреЗ: MutableList <PlanNode>-рдмрдЪреНрдЪрд╛ рдиреЛрдбреНрд╕
рдЧреБрдг: рдореНрдпреВрдЯреЗрдмрд▓рд┐рд╕реНрдЯ <рдЬреЛрдбрд╝реА <рд╕реНрдЯреНрд░рд┐рдВрдЧ, рд╕реНрдЯреНрд░рд┐рдВрдЧ >>рдХреБрдВрдЬреА : рдЗрдВрдбреЗрдХреНрд╕ рдХрдВрдбреЛрдо, рдореВрд▓реНрдп : (рдЙрдореНрд░ <10);
рдХреБрдВрдЬреА : рдлрд╝рд┐рд▓реНрдЯрд░, рдорд╛рди : (рдирд╛рдо) :: рдЯреЗрдХреНрд╕реНрдЯ = 'рдЬреИрдХ' :: рдЯреЗрдХреНрд╕реНрдЯ)
рдЧреБрдг
рдЕрдиреНрдп: MutableList <рд╕реНрдЯреНрд░рд┐рдВрдЧ>-рдЪреЗрдХрдЗрдирдХреНрд╕ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╕рднреА рдХреЛ рдорд╛рдиреНрдпрддрд╛ рдирд╣реАрдВ рджреА рдЬрд╛ рд╕рдХрддреА рд╣реИ

AssertService


рдкрд╛рд░реНрд╕рд░ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрднрд╡ рд╣реИред CheckInxAssertService, рдКрдкрд░ рд╡рд░реНрдгрд┐рдд PlanNode рдЯреНрд░реА рдХреЗ рдЪреЗрдХ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд▓реИрдВрдмрдбрд╛рд╕ рд╕реЗрдЯ рдХрд░рдиреЗ рдпрд╛ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╡рд╛рд▓реЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддрд╛рдХрд┐ рдЖрдкрдХреА рдХреНрд╡реЗрд░реА рдореЗрдВ Seq рд╕реНрдХреИрди рди рд╣реЛ, рдпрд╛ рдЖрдк рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ / рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

CoverageLevel


рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг Enum, рдореИрдВ рдЗрд╕реЗ рдЕрд▓рдЧ рд╕реЗ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛:
рдореВрд▓реНрдпрд╡рд┐рд╡рд░рдг
NOT_USING
рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд▓рдХреНрд╖реНрдп (рдЗрдВрдбреЗрдХреНрд╕) рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
рд╢реВрдиреНрдп
рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ (Seq рд╕реНрдХреИрди)
рдЖрдзрд╛
рд╕реВрдЪрдХрд╛рдВрдХ (рдЗрдВрдбреЗрдХреНрд╕ рд╕реНрдХреИрди) рджреНрд╡рд╛рд░рд╛ рдХреНрд╡реЗрд░реА рдХрд╛ рдЖрдВрд╢рд┐рдХ рдХрд╡рд░реЗрдЬред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЦреЛрдЬ рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдореА рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ
рдкреВрд░реНрдг
рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдХреНрд╡реЗрд░реА рдХрд╛ рдкреВрд░реНрдг рдХрд╡рд░реЗрдЬ (рдХреЗрд╡рд▓ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрдХреИрди)
рдЕрдЬреНрдЮрд╛рдд
рдЕрдЬреНрдЮрд╛рдд рдХрд╡рд░реЗрдЬред рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ, рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛ред

рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдХреБрдЫ рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред

CheckInx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреЗрд╕реНрдЯ рдЙрджрд╛рд╣рд░рдг


рдореИрдВрдиреЗ рдЧрд┐рдЯрд╣рдм рдЪреЗрдХрдЗрдирдХреНрд╕-рдбреЗрдореЛ рдкрд░ рдПрдХ рдЕрд▓рдЧ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд┐рдпрд╛, рдЬрд╣рд╛рдВ рдореИрдВрдиреЗ рдкрд╛рд▓рддреВ рдЬрд╛рдирд╡рд░реЛрдВ рдХреА рдореЗрдЬ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬреЗрдкреАрдП рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдЪреЗрдХрд┐рдВрдЧ рдХрд╡рд░реЗрдЬ, рдЗрдВрдбреЗрдХреНрд╕ рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХрд┐рдПред рд╡рд╣рд╛рдВ рдПрдХ рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

рдЖрдк рдЗрд╕ рддрд░рд╣ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

 @Test fun testFindByLocation() {  // ARRANGE  val location = "Moscow"  //   ,      10-20.  //   TestNG      @BeforeClass  IntRange(1, 10000).forEach {      val pet = Pet()      pet.id = UUID.randomUUID()      pet.age = it      pet.location = "Saint Petersburg"      pet.name = "Jack-$it"      repository.save(pet)  }  // ACT  //     sqlInterceptor.startInterception()  //    val pets = repository.findByLocation(location)  //    sqlInterceptor.stopInterception()  // ASSERT  //         assertEquals(1, sqlInterceptor.statements.size.toLong())  // ,    ix_pets_location    (Index Scan)  checkInxAssertService.assertCoverage(CoverageLevel.HALF, "ix_pets_location", sqlInterceptor.statements[0])  //        ,      Seq Scan,        checkInxAssertService.assertCoverage(CoverageLevel.HALF, sqlInterceptor.statements[0])  // ...  ,      checkInxAssertService.assertPlan(plan) {          it.coverageLevel.level < CoverageLevel.FULL.level      } } 

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпреЛрдЬрдирд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛ рд╕рдХрддреА рд╣реИ:

 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() {  // ARRANGE  val location = "Moscow"  // ACT  //     sqlInterceptor.startInterception()  //    val pets = repository.findByLocation(location)  //    sqlInterceptor.stopInterception()  // ASSERT  //  ""    val executionPlan = executionPlanQuery.execute(sqlInterceptor.statements[0])  //    -   val plan = executionPlanParser.parse(executionPlan)  assertNotNull(plan)  // ...     val rootNode = plan.rootPlanNode  assertEquals("Index Scan", rootNode.coverage)  assertEquals("ix_pets_location", rootNode.target)  assertEquals("pets pet0_", rootNode.table) } 


рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрд╢рди


рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдореИрдВрдиреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╕рдореВрд╣ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛, рдЗрд╕реЗ рдЧрд╣рди рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рдХрд╣рд╛ред

рдЪреЗрдХреНрд╕рд┐рдВрдХреНрд╕-рдмрд░реНрддрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рдФрд░ рд╢реБрд░реВ рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИред рдЪрд▓реЛ рдирд┐рд░реНрдорд╛рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рдкрд╣рд▓реЗ рднрдВрдбрд╛рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред рдХрд┐рд╕реА рджрд┐рди рдореИрдВ рдЪреЗрдХрдЗрдирдХреНрд╕ рдХреЛ рдорд╛рд╡реЗрди рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░ рджреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдм рдЖрдк рдЬреАрдЯрд╣рдм рд╕реЗ рдХреЗрд╡рд▓ рдЬреАрдЯрдкреИрдХ рдХреЗ рдЬрд░рд┐рдП рд╣реА рдЖрд░реНрдЯрд╡рд░реНрдХ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 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 рдХрдИ рд╕реЗрдо рдЬреЛрдбрд╝рддрд╛ рд╣реИ:

  1. DataSourceWrapper
  2. PostgresInterceptor
  3. PostgresExecutionPlanParser
  4. PostgresExecutionPlanQuery
  5. 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()  } } 


рд╡рд┐рдХрд╛рд╕ рдХреА рдпреЛрдЬрдирд╛рдПрдБ


  1. рдореИрдВ рдпрд╣ рд╕рдордЭрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдореЗрд░реЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдмрдирд╛рдПрдВред рдореБрдЭреЗ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред
  2. рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЬрд░реВрд░рдд рд╣реИ рдФрд░ рдореБрдЦрд░ рддрд░реАрдХреЛрдВ рдХреА рдорд╛рдирдХ рд╕реВрдЪреА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВред
  3. рдЕрдиреНрдп рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦреЗрдВред
  4. SqlInterceptor.statements [0] рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ, рдореИрдВ рдЗрд╕реЗ рд╕реБрдзрд╛рд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреА рдХрд┐ рдЕрдЧрд░ рдХреЛрдИ рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рдЕрднреНрдпрд╛рд╕ рдХрд░рдХреЗ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдХреНрд░реЗрдбрд┐рдЯ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╣реЛрдВрдЧреА: рдпрд╣ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдХреНрд╡реЗрд░реА рдкреНрд▓рд╛рдирд░ рдХреИрд╕реЗ рдареЗрд╕ рдкрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛, рдпрд╣ рд╕рдм рдПрдХрддреНрд░рд┐рдд рдЖрдВрдХрдбрд╝реЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ ред

рджрд░рдЕрд╕рд▓, рдПрдХ рдпреЛрдЬрдирд╛рдХрд╛рд░ред рдкрд╣рд▓реЗ рдПрдХрддреНрд░ рдХрд┐рдП рдЧрдП рдЖрдБрдХрдбрд╝реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╕реЗ рдЕрд▓рдЧ рдПрдХ рдпреЛрдЬрдирд╛ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрд░реНрде рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИред

рдпреЛрдЬрдирд╛рдХрд╛рд░ рдХрд╛ рдХрд╛рд░реНрдп рд╕реБрдзрд╛рд░ рдХрд░рдирд╛ рд╣реИ, рдмрд┐рдЧрдбрд╝рдирд╛ рдирд╣реАрдВ, рдЕрдиреБрд░реЛрдзред рдЗрд╕рд▓рд┐рдП, рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдг рдХреЗ, рд╡рд╣ рдЕрдЪрд╛рдирдХ рд╕реЗрдХ рд╕реНрдХреИрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдк рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдкрдХреЛ CheckInx рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╕рдордп, рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ рдФрд░ рд╕реВрдЪрдХрд╛рдВрдХ рдмрдирд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдПрдВ рдХрд┐ рдпрд╣рд╛рдВ рдХрд┐рд╕реА рднреА рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЖрдк Seq рд╕реНрдХреИрди рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рд╣реИрдВред рдпрд╣ рдЖрдкрдХреЛ рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛ рдкрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдкреНрд░рд╢реНрди рдХрд░рдиреЗ рд╕реЗ рдмрдЪрд╛рдПрдЧрд╛ред

рд╕рдВрджрд░реНрдн


  1. https://github.com/TinkoffCreditSystems/checkinx-utils
  2. https://github.com/dsemyriazhko/checkinx-demo
  3. https://github.com/ttddyy/datasource-proxy
  4. https://mvnrepository.com/artifact/org.testcontainers/postgresql
  5. https://github.com/javamelody/javamelody/wiki

Source: https://habr.com/ru/post/hi454066/


All Articles