рдмреЗрд╕реНрдЯ рдПрд╕рдХреНрдпреВрдПрд▓ рдмрд┐рд▓реНрдбрд░ - рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░ jOOQ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рдмреЗрд╕реНрдЯ SQL рдмрд┐рд▓реНрдбрд░ред Android рдкрд░ jOOQ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рдкрд░рд┐рдЪрдп


Android рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдореБрдЦреНрдп рднрдВрдбрд╛рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ SQLite рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИред рдЖрдорддреМрд░ рдкрд░, рдореЛрдмрд╛рдЗрд▓ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдпреЛрдЬрдирд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ рдФрд░ 10-15 рдЯреЗрдмрд▓ рд╣реЛрддреЗ рд╣реИрдВред рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА SQL рдмрд┐рд▓реНрдбрд░, ORM, рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдирдВрдЧреЗ SQLite API рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред


рд▓реЗрдХрд┐рди, рдЕрдлрд╕реЛрд╕, рд╕рднреА рдбреЗрд╡рд▓рдкрд░реНрд╕ рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдХрднреА-рдХрднреА рдмрдбрд╝реЗ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ, рд╕рдВрдЧреНрд░рд╣реАрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ, рдХрд╕реНрдЯрдо рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпрд╛ рдмрд╣реБрдд рдореЛрдЯреА рдЗрдХрд╛рдИ рдХреЗ рд▓рд┐рдП рдХреНрд╡реЗрд░реА рдореЗрдВ 10 рдЗрдирд░ рдЬреЙрдЗрди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╣рдорд╛рд░рд╛ рдмрд╣реБрдд рдХреБрдЫ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЖрдкрдХрд╛ рд╡рдлрд╛рджрд╛рд░ рд╕реЗрд╡рдХ рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рдирд╣реАрдВ рдерд╛, рдЬрд┐рд╕рд╕реЗ рдЗрд╕ рд▓реЗрдЦ рдХреА рд╕рд╛рдордЧреНрд░реА рд╕рд╛рдордиреЗ рдЖрдИред рдЦреИрд░, рдХрдареЛрд░ рд╕рдордп рдХреЗ рд▓рд┐рдП рдХрдареЛрд░ рдЙрдкрд╛рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рддреЛ, рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░ jOOQ рд░реЛрд▓ рдХрд░реЗрдВред


рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди


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


рдЕрдЧрд▓рд╛, рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдордиреЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдИ рд╣реИрдВред рд╣рдо рдЕрднреА рдЙрдиреНрд╣реЗрдВ рдПрдВрдбреНрд░реЙрдЗрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреЙрдкреА рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗ - рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкрд╣рд▓реА javax рдПрдиреЛрдЯреЗрд╢рди рдкрд░ рд╣реИред рджреЛ рд╡рд┐рдХрд▓реНрдк, рджреЛрдиреЛрдВ рд╕рд╛рдорд╛рдиреНрдпред рдпрд╛ рддреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЬреЛрдбрд╝реЗрдВ (org.glassfish: javax.annotation), рдпрд╛ - рдЕрджреНрднреБрдд рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ - рдЦреЛрдЬреЗрдВ рдФрд░ рдЧреБрдВрдЬрд╛рдЗрд╢ рдореЗрдВ рдмрджрд▓реЗрдВред


рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рд╕рднреА рдкреНрд░реАрд╕реЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╢рд╛рдпрдж рдЖрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓реЙрдиреНрдЪ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рдореМрдХрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдЖрдкрдХреЛ Android API рд╕реНрддрд░ <24 рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ - рддреЛ рдореВрд░реНрдЦ рдордд рдмрдиреЛ, рдпрд╣ рд╣рдорд╛рд░реА рдпрд╛рддреНрд░рд╛ рдХрд╛ рдЕрдВрдд рдирд╣реАрдВ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдУрдкрди-рд╕реЛрд░реНрд╕ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдлрд┐рд▓рд╣рд╛рд▓ jOOQ рдХрдИ рдорд╛рдпрдиреЛрдВ рдореЗрдВ рдЬрд╛рд╡рд╛ 8 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░ рдмрд╣реБрдд рд╣реА рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рджреЛрд╕реНрдд рд╣реИрдВред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рднреА рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдпрд╛ рддреЛ jOOQ рдЦрд░реАрджреЗрдВ, рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреЗрдВ рдФрд░ рдлрд╛рдбрд╝рдХрд░ рдЬрд╛рд╡рд╛ 6 рдпрд╛ рдЬрд╛рд╡рд╛ 7 (рд╡реЗ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд▓реЗрдЦреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП) рдХреЗ рд▓рд┐рдП рдкреВрдЫреЗрдВ, рдпрд╛ рдпрджрд┐ рдЖрдк, рдореЗрд░реА рддрд░рд╣, рддреЛ рдПрдХ рдХрдард┐рди рдирд╣реАрдВ рд╣реИ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рднреА рдирд╡реАрдирддрдо рдирд╡рд╛рдЪрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рднреБрдЧрддрд╛рди рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛, рдЕрд░реНрдерд╛рддреН рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ред jOOQ рдиреЗ рдЬрд╛рд╡рд╛ 8 рдореЗрдВ рдЗрддрдиреА рджреЗрд░ рдкрд╣рд▓реЗ рдкреНрд░рд╡рд╛рд╕ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдерд╛ред рдорд╛рдЗрдЧреНрд░реЗрд╢рди рд╕реЗ рдкрд╣рд▓реЗ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг 3.6.0 рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рдЬрдирд░реЗрдЯрд░ groovy version = '3.6.0' рд╕рд╛рде рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


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


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


рдХреЛрдб рдЬрдирд░реЗрд╢рди


JOOQ рдкреНрд▓рдЧрдЗрди рд╕реЗрдЯрдЕрдк рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:


 buildScript { repositories { mavenCentral() } dependencies { classpath "nu.studer:gradle-jooq-plugin:$jooq_plugin_version" } } apply plugin: 'nu.studer.jooq' dependencies { jooqRuntime "org.xerial:sqlite-jdbc:$xerial_version" } jooq { version = '3.6.0' edition = 'OSS' dev(sourceSets.main) { jdbc { driver = 'org.sqlite.JDBC' url = 'jdbc:sqlite:/Path/To/Database/database.db3' } generator { name = 'org.jooq.util.DefaultGenerator' strategy { name = 'org.jooq.util.DefaultGeneratorStrategy' } database { name = 'org.jooq.util.sqlite.SQLiteDatabase' } generate { relations = true deprecated = false records = true immutablePojos = true fluentSetters = true } target { packageName = 'com.example.mypackage.data.database' } } } } 

рдПрдВрдбреНрд░реЙрдпрдб


рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрднрд░рддрд╛рдПрдБ:


 implementation "org.jooq:jooq:$jooq_version" implementation "org.sqldroid:sqldroid:$sqldroid_version" implementation "org.glassfish:javax.annotation:$javax_annotations_version" 

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


 class DatabaseAdapter(private val context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) { companion object { private const val DATABASE_NAME = "database" private const val DATABASE_VERSION = 1 @JvmStatic private val OPEN_OPTIONS = mapOf( "cache" to "shared", "journal_mode" to "WAL", "synchronous" to "ON", "foreign_keys" to "ON") } val connectionLock: ReentrantLock = ReentrantLock(true) val configuration: Configuration by lazy(mode = LazyThreadSafetyMode.NONE) { connectionLock.withLock { // ensure the database exists, // all upgrades are performed, // and connection is ready to be set val database = context.openOrCreateDatabase( DATABASE_NAME, Context.MODE_PRIVATE, null) if (database.isOpen) { database.close() } // register SQLDroid driver to be used for establishing connections // with our database DriverManager.registerDriver( Class.forName("org.sqldroid.SQLDroidDriver") .newInstance() as Driver) DefaultConfiguration() .set(SQLiteSource( context, OPEN_OPTIONS, "database", arrayOf("databases"))) .set(SQLDialect.SQLITE) } } override fun onCreate(db: SQLiteDatabase) { // acquire monitor until the database connection is created // this is important as otherwise transactions might be tryingg to run // concurrently that will lead to crashes connectionLock.withLock { // TODO: Create tables } } override fun onOpen(db: SQLiteDatabase) { // acquire monitor until the database connection is established // this is important as otherwise transactions might be tryingg to run // concurrently that will lead to crashes connectionLock.withLock { super.onOpen(db) } } override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { // acquire monitor until the database is upgraded // this is important as otherwise transactions might be tryingg to run // concurrently that will lead to crashes connectionLock.withLock { } } infix inline fun <reified T> transaction(noinline f: (Configuration) -> T): Observable<T> = Observable.create { emitter -> val tryResult = Try { connectionLock.withLock { DSL.using(configuration).transactionResult(f) } } when (tryResult) { is Try.Success -> { emitter.onNext(tryResult.value) emitter.onComplete() } is Try.Failure -> { emitter.onError(tryResult.exception) } } } fun invalidate() { connectionLock.withLock { // TODO: Drop tables, vacuum and create tables } } private class SQLiteSource(val context: Context, val options: Map<String, String>, val database: String, val fragments: Array<out String>): DroidDataSource() { override fun getConnection(): Connection = openConnection(options) private fun openConnection(options: Map<String, String> = emptyMap()): Connection { return DriverManager.getConnection(StringBuilder().apply { append("jdbc:sqldroid:") append(context.applicationInfo.dataDir) append("/") append(buildFragments(fragments)) append(database) append("?") append(buildOptions(options)) }.toString()) } private fun buildFragments(fragments: Array<out String>) = when (fragments.isEmpty()) { true -> "" false -> "${fragments.joinToString("/")}/" } private fun buildOptions(options: Map<String, String>) = options.mapTo(mutableListOf<String>()) { entry -> "${entry.key}=${entry.value}" } .joinToString(separator = "&") } } 

UPD: рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ mode = LazyThreadSafetyMode.NONE рдЖрд▓рд╕реА рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП, рдзрдиреНрдпрд╡рд╛рдж konstantin_berkow


рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рдмрдЬрд╛рдп


рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдПрдВрдбреНрд░реЙрдЗрдб рдореЗрдВ jOOQ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдРрд╕реА рдЬрдЯрд┐рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдПрдХ рдмрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдФрд░ рдлрд┐рд░ рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдкреБрд░рд╛рдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рд╕реЗ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


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

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


All Articles