{"id":405650,"date":"2024-06-29T18:27:53","date_gmt":"2024-06-29T18:27:53","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=405650"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=405650","title":{"rendered":"<span>Jooq 3.15+. \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 R2DBC \u0438 JDBC \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\u041f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e!<\/p>\n<p>  \u041d\u0430 \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u0438\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043b\u0435\u0442 \u043c\u043e\u0435\u0433\u043e \u043e\u043f\u044b\u0442\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u041f\u041e, \u043d\u0435 \u0440\u0430\u0437 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0441\u044f \u0441 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0435\u0439, \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 SQL-\u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0437\u0434\u043e\u0440\u043e\u0432\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0442\u044c \u0438 \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0430 \u0444\u0440\u043e\u043d\u0442, \u044f \u043d\u0430\u043f\u0438\u0448\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443. \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0434\u0432\u0443\u043c\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u043c\u0438, \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440: R2DBC \u0438 JDBC<\/p>\n<p>  <a name=\"habracut\"><\/a>  <\/p>\n<h3>\u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/h3>\n<p>  <\/p>\n<ul>\n<li> \u0411\u0438\u0437\u043d\u0435\u0441 \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d \u0432 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u0445 \u0438 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432 \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0434\u0435\u043d\u044c\u0433\u0438 \u043d\u0430 NoSql \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u0432 <\/li>\n<li> \u0412 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0435\u0441\u0442\u044c \u0441\u0438\u043b\u044c\u043d\u044b\u0439 front-end \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0431\u043e\u0438\u0442\u0441\u044f \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0444\u0440\u043e\u043d\u0442\u0435 \u0438 \u0438\u0445 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c. \u0423\u043c\u0435\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u043c<\/li>\n<li> \u0415\u0441\u0442\u044c back-end \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0432\u0430\u0436\u0430\u0435\u0442 \u0441\u0435\u0431\u044f, \u043f\u0438\u0448\u0435\u0442 \u043a\u043e\u0434 \u0434\u043b\u044f \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043c\u043e\u0449\u043d\u043e\u0433\u043e \u0436\u0435\u043b\u0435\u0437\u0430 <\/li>\n<li> \u0417\u0430\u0434\u0430\u0447\u0430 \u0441\u0432\u044f\u0437\u0430\u043d\u0430 \u0441 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0444\u0440\u043e\u043d\u0442\u0435 (\u0431\u0443\u0434\u044c \u0442\u043e \u0433\u0435\u043e\u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u0438\u043b\u0438 \u043a\u0430\u0440\u0442\u043e\u0442\u0435\u043a\u0430 \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0435) <\/li>\n<\/ul>\n<p>  <\/p>\n<h3>\u0427\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c?<\/h3>\n<p>  <\/p>\n<ol>\n<li> \u0412\u0437\u044f\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0431\u0430\u0437\u044b. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u0430 \u0431\u0430\u0437\u0430 \u0424\u0418\u0410\u0421 <\/li>\n<li> \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u043e\u0442\u0434\u0430\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u0443 <\/li>\n<\/ol>\n<p>  <\/p>\n<h3>\u041f\u043b\u0430\u043d \u0440\u0430\u0431\u043e\u0442<\/h3>\n<p>  <\/p>\n<ol>\n<li> \u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c SQL-\u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0432\u044b\u0431\u043e\u0440\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 <\/li>\n<li> \u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0443 <\/li>\n<li> \u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043b \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0432\u044b\u0431\u043e\u0440\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0442\u0430\u043a\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u044b \u043e\u0442\u0434\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u0434\u043b\u044f \u0441\u043a\u043e\u0440\u0435\u0439\u0448\u0435\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 <\/li>\n<li> \u0421\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 <\/li>\n<\/ol>\n<p>  <\/p>\n<h3>\u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0442\u0435\u043a<\/h3>\n<p>  <\/p>\n<ul>\n<li> Spring boot 2.5+ <\/li>\n<li> PostgreSQL <\/li>\n<li> Jooq Framework <\/li>\n<li> Spring Webflux <\/li>\n<li> Srping Web MVC <\/li>\n<li> R2dbc driver \u0434\u043b\u044f PostgreSQL <\/li>\n<li> Jdbc driver \u0434\u043b\u044f PostgreSQL <\/li>\n<\/ul>\n<p>  <\/p>\n<h3>\u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438<\/h3>\n<p>  \u041b\u0435\u0436\u0430\u0442 <a href=\"https:\/\/github.com\/minpor\/r2dbc-and-jdbc-jooq-test\" rel=\"nofollow noopener noreferrer\">\u0442\u0443\u0442<\/a>.<\/p>\n<h3>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0432\u044b\u0431\u043e\u0440\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0445<\/h3>\n<p>  \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u043a\u0430\u043a\u0443\u044e-\u043d\u0438\u0431\u0443\u0434\u044c \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430. \u0422\u0430\u043a \u043a\u0430\u043a \u044f \u043f\u0440\u043e\u0436\u0438\u0432\u0430\u044e \u0432 \u0420\u043e\u0441\u0441\u0438\u0438, \u0442\u043e \u043d\u0430 \u0443\u043c \u043f\u0440\u0438\u0448\u043b\u0430 \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0424\u0418\u0410\u0421\u0430 (\u0424\u0435\u0434\u0435\u0440\u0430\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0430\u0434\u0440\u0435\u0441\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430).<\/p>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 jooq_test \u0432 PostgreSQL.<\/p>\n<pre><code class=\"sql\">CREATE DATABASE jooq_test; <\/code><\/pre>\n<p>  \u041f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 <a href=\"https:\/\/fias.nalog.ru\/Updates\" rel=\"nofollow noopener noreferrer\">\u0424\u0418\u0410\u0421\u0430<\/a> \u0438 \u0441\u043a\u0430\u0447\u0430\u0435\u043c \u043d\u0443\u0436\u043d\u044b\u0439 \u0430\u0440\u0445\u0438\u0432<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/we\/bo\/gc\/webogc4prrnqjlscsxidqitxwo4.png\" data-src=\"https:\/\/habrastorage.org\/webt\/we\/bo\/gc\/webogc4prrnqjlscsxidqitxwo4.png\"\/><\/p>\n<p>  \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f Linux \u0443\u0442\u0438\u043b\u0438\u0442\u043a\u0438 pgdbf \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0431\u0430\u0437\u0443:<\/p>\n<pre><code class=\"bash\">pgdbf DOMA.DBF | iconv -c -f cp866 -t UTF-8| psql jooq_test pgdbf FLAT.DBF | iconv -c -f cp866 -t UTF-8| psql jooq_test pgdbf STREET.DBF | iconv -c -f cp866 -t UTF-8| psql jooq_test <\/code><\/pre>\n<p>  \u0414\u043e\u0436\u0434\u0451\u043c\u0441\u044f \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0431\u0430\u0437\u0443 \u043f\u0440\u043e\u0433\u0440\u0443\u0437\u044f\u0442\u0441\u044f \u0438 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u044d\u0442\u0430\u043f\u0443. <\/p>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445 \u043c\u044b \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u043c. \u042d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0445. \u0426\u0435\u043b\u044c \u043d\u0430\u0448\u0430 \u0432\u043e\u0432\u0441\u0435 \u043d\u0435 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0447\u0443\u0442\u044c \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0441\u0434\u0435\u043b\u0430\u0435\u043c JOIN \u0442\u0440\u0451\u0445 \u0442\u0430\u0431\u043b\u0438\u0446, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 (doma):<\/p>\n<pre><code class=\"sql\">select d.* from doma d     join street s on d.ocatd = s.ocatd     join flat f on f.gninmb = s.gninmb <\/code><\/pre>\n<p>  \u0418 \u0442\u0430\u043a, \u0441 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438\u0441\u044c. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043a\u043e\u0434\u0430.<\/p>\n<h3>Jdbc-\u043f\u043e\u0434\u0445\u043e\u0434<\/h3>\n<p>  \u041a\u0430\u043a \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432\u044b\u0448\u0435, \u0441\u0442\u0435\u043a \u0443 \u043d\u0430\u0441 Spring Boot + MVC + PostgreSQL Driver. \u0421\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Gradle<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">build.gradle.kts<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"kotlin\">import nu.studer.gradle.jooq.JooqEdition import org.jetbrains.kotlin.gradle.tasks.KotlinCompile   \/\/ \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043b\u0430\u0433\u0438\u043d\u044b plugins {     id(\"org.springframework.boot\") version \"2.5.6\"     id(\"io.spring.dependency-management\") version \"1.0.11.RELEASE\"     id(\"nu.studer.jooq\") version (\"6.0.1\")     kotlin(\"jvm\") version \"1.5.31\"     kotlin(\"plugin.spring\") version \"1.5.31\" }  group = \"ru.jooq.test\" version = \"0.0.1-SNAPSHOT\" java.sourceCompatibility = JavaVersion.VERSION_11  repositories {     mavenCentral() }  val postgresVersion = \"42.3.1\"  dependencies {     \/\/ \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f jooq     jooqGenerator(\"org.postgresql:postgresql:$postgresVersion\")     \/\/ Spring \u0441\u0442\u0430\u0440\u0442\u0435\u0440\u044b     implementation(\"org.springframework.boot:spring-boot-starter-jooq\")     implementation(\"org.springframework.boot:spring-boot-starter-jdbc\")     implementation(\"com.fasterxml.jackson.module:jackson-module-kotlin\")     implementation(\"org.jetbrains.kotlin:kotlin-reflect\")     implementation(\"org.jetbrains.kotlin:kotlin-stdlib-jdk8\")     runtimeOnly(\"org.postgresql:postgresql\")     testImplementation(\"org.springframework.boot:spring-boot-starter-test\") }  tasks.withType&lt;KotlinCompile> {     kotlinOptions {         freeCompilerArgs = listOf(\"-Xjsr305=strict\")         jvmTarget = \"11\"     } }  tasks.withType&lt;Test> {     useJUnitPlatform() }  \/\/ \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0434\u043b\u044f Jooq Framework jooq {     edition.set(JooqEdition.OSS)      configurations {         create(\"main\") {             jooqConfiguration.apply {                 jdbc.apply {                     driver = \"org.postgresql.Driver\"                     url = \"jdbc:postgresql:\/\/localhost:5432\/jooq_test\"                     user = \"postgres\"                     password = \"postgres\"                 }                 generator.apply {                     name = \"org.jooq.codegen.DefaultGenerator\"                     generate.apply {                         isDeprecated = false                         isRecords = true                         isImmutablePojos = false                         isFluentSetters = false                         isJavaBeansGettersAndSetters = false                     }                     database.apply {                         name = \"org.jooq.meta.postgres.PostgresDatabase\"                         inputSchema = \"public\"                     }                     target.apply {                         packageName = \"ru.jooq.test.jooqtest.domain\"                     }                     strategy.name = \"org.jooq.codegen.DefaultGeneratorStrategy\"                 }             }         }     } } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c. \u041e\u0431 \u044d\u0442\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u0442\u0435\u0439.<\/p>\n<p>  \u041e\u043f\u0438\u0448\u0435\u043c \u0444\u0430\u0439\u043b \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0432 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">application.yml<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\">spring:   datasource:     driverClassName: org.postgresql.Driver     hikari:       jdbc-url: jdbc:postgresql:\/\/localhost:5432\/jooq_test       username: postgres       password: postgres   jooq:     sql-dialect: postgres <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u041c\u044b \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a \u043e\u043f\u0438\u0441\u0430\u043b\u0438 \u043f\u0440\u043e\u043f\u0435\u0440\u0442\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0431\u0430\u0437\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u043f\u043e \u043f\u0443\u0442\u0438 spring.datasource.hikari. \u0423 \u043d\u0430\u0441 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445. \u041e\u0434\u0438\u043d \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0435\u0442 \u0425\u0438\u043a\u0430\u0440\u0438, \u0430 \u0432\u0442\u043e\u0440\u043e\u0439 R2dbc<\/p>\n<p>  \u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u043b\u0435\u0436\u0438\u0442 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u0435: <b>ru.jooq.test.jooqtest<\/b>. \u041a\u043b\u0430\u0441\u0441\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438 \u0434\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 \u0431\u0438\u0437\u043d\u0435\u0441\u043e\u0432\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c.<\/p>\n<p>  \u041a\u0430\u043a \u0438 \u043b\u044e\u0431\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Spring Boot&#8217;a \u0432\u0441\u0451 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 @SpringBootApplication<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">JooqTestApplication.kt<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"kotlin\">package ru.jooq.test.jooqtest  import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication  @SpringBootApplication class JooqTestApplication  fun main(args: Array&lt;String>) {     runApplication&lt;JooqTestApplication>(*args) } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0442\u043e\u0436\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u043c\u044b \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u043c. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c\u2026<\/p>\n<p>  \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0443 \u043d\u0430\u0441 \u043b\u0435\u0436\u0430\u0442 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 JooqConfiguration<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">JooqConfiguration.kt<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"kotlin\">package ru.jooq.test.jooqtest  import javax.sql.DataSource import org.jooq.DSLContext import org.jooq.impl.DSL import org.jooq.impl.DataSourceConnectionProvider import org.jooq.impl.DefaultConfiguration import org.jooq.impl.DefaultDSLContext import org.springframework.boot.context.properties.ConfigurationProperties import org.springframework.boot.jdbc.DataSourceBuilder import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy   @Configuration class JooqConfiguration {      \/\/ \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c dslConext \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0421\u0423\u0411\u0414     @Bean(value = [\"jdbcDSLContext\"])     fun jdbcDSLContext(): DSLContext {         return DefaultDSLContext(configuration())     }      \/\/ DataSource \u0438\u0437 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a application.yml     @Bean     @ConfigurationProperties(prefix = \"spring.datasource.hikari\")     fun dataSource(): DataSource {         return DataSourceBuilder.create().build()     }      \/\/ \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435     @Bean     fun lazyConnectionDataSource(): LazyConnectionDataSourceProxy {         return LazyConnectionDataSourceProxy(dataSource())     }      @Bean     fun connectionProvider(): DataSourceConnectionProvider {         return DataSourceConnectionProvider(lazyConnectionDataSource())     }      @Bean     fun configuration(): DefaultConfiguration {         val jooqConfiguration = DefaultConfiguration()         jooqConfiguration.set(connectionProvider())         return jooqConfiguration     } } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u041a\u0430\u043a \u0443\u0436\u0435 \u0440\u0430\u043d\u0435\u0435 \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e, \u0443 \u043d\u0430\u0441 \u0434\u0432\u0430 dataSource \u0438 \u043f\u043e \u044d\u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043d\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e spring boot&#8217;\u0430.<\/p>\n<p>  \u041e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u0434\u0430\u043d\u043d\u044b\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b HTTP, \u0432\u044b\u0445\u043e\u0434\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0432 ResultDto-\u043a\u043b\u0430\u0441\u0441\u0435<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">ResultDto.kt<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"kotlin\"> class ResultDto(     val queryTime: LocalDateTime, \/\/ \u0412\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430     val dataTime: LocalDateTime, \/\/ \u0412\u0440\u0435\u043c\u044f \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430 \u0434\u0430\u043d\u043d\u044b\u0445     timeToResult: Long? = 0,     val dataDto: DataDto \/\/ \u041d\u0430\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b ) {     val timeToResult: Long = Duration.between(queryTime, dataTime).toMillis() }  data class DataDto(     val name: String,     val korp: String,     val socr: String,     val code: String,     val index: String,     val gninmb: String,     val uno: String,     val ocatd: String ) <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0434\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0439 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0411\u0414 \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u0438 \u0440\u0430\u043d\u0435\u0435.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">SampleRepository<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"kotlin\">package ru.jooq.test.jooqtest  import java.time.LocalDateTime import org.jooq.DSLContext import org.jooq.Record8 import org.jooq.SelectLimitPercentStep import org.springframework.beans.factory.annotation.Qualifier import org.springframework.stereotype.Repository import ru.jooq.test.jooqtest.domain.Tables  @Repository class SampleRepository(     @Qualifier(\"jdbcDSLContext\")     private val jdbcDSLContext: DSLContext ) {      private val d = Tables.DOMA     private val s = Tables.STREET     private val f = Tables.FLAT      \/\/ \u041c\u0430\u043f\u043f\u0438\u043d\u0433 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u044c ResultDto     fun getBlockingJooq(queryTime: LocalDateTime, limit: Long): List&lt;ResultDto> {         return getQuery(jdbcDSLContext, limit)             .map { r ->                 ResultDto(                     queryTime = queryTime,                     dataTime = LocalDateTime.now(),                     dataDto = r.into(d).into(DataDto::class.java)                 )             }     }     \/\/ SQL-\u0437\u0430\u043f\u0440\u043e\u0441     private fun getQuery(dslContext: DSLContext, limit: Long): SelectLimitPercentStep&lt;Record8&lt;String, String, String, String, String, String, String, String>> {         return dslContext             .select(d.NAME, d.KORP, d.SOCR, d.CODE, d.INDEX, d.GNINMB, d.UNO, d.OCATD)             .from(d)             .join(s).on(s.OCATD.eq(d.OCATD))             .join(f).on(f.GNINMB.eq(s.GNINMB))             .limit(limit)     } } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u044b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043c\u0441\u044f \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c \u043b\u0438\u0448\u044c \u043d\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a. \u042d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. <i><a href=\"https:\/\/habr.com\/ru\/users\/qualifier\/\" class=\"user_link\">Qualifier<\/a>(\u00abjdbcDSLContext\u00bb)<\/i> \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u043e\u0442 bean, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d.<\/p>\n<p>  \u041c\u0435\u0442\u043e\u0434 getBlockingJooq \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u0435 <b>SampleService<\/b><\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">SampleService.kt<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"kotlin\">package ru.jooq.test.jooqtest  import java.time.LocalDateTime import org.springframework.stereotype.Service  @Service class SampleService(private val sampleRepository: SampleRepository) {      \/\/ \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c     fun getBlockingJooq(queryTime: LocalDateTime, limit: Long): List&lt;ResultDto> {         return sampleRepository.getBlockingJooq(queryTime, limit)     } } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u0430\u043c end-point \u043e\u043f\u0438\u0448\u0435\u043c \u0432 <b>SampleController<\/b><\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">SampleController.kt<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"kotlin\">package ru.jooq.test.jooqtest  import java.time.LocalDateTime import org.springframework.http.MediaType import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.RequestParam import org.springframework.web.bind.annotation.RestController  @RestController class SampleController(private val sampleService: SampleService) {      @GetMapping(\"\/sample\/jooq-blocking\")     fun jooqBlocking(@RequestParam limit: Long): List&lt;ResultDto> {         return sampleService.getBlockingJooq(LocalDateTime.now(), limit)     }  } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 RestController \u0438 \u043c\u0435\u0442\u043e\u0434 jooqBlocking \u0441 \u043e\u0434\u043d\u0438\u043c \u043b\u0438\u0448\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0430: <i>limit<\/i>. \u0412 \u0441\u0435\u0440\u0432\u0438\u0441 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0434\u0430\u0442\u0443 \u0438 \u043f\u0440\u0438\u0448\u0435\u0434\u0448\u0438\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430. \u0420\u0435\u0441\u0443\u0440\u0441 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0441\u0442\u0440\u043e\u043a\u0438 <b>\/sample\/jooq-blocking<\/b>, \u0430 \u043f\u043e\u043b\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"bash\">curl http:\/\/localhost:8080\/sample\/jooq-blocking?limit=1000000<\/code><\/pre>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0443\u0440\u043b\u0430, \u0431\u044b\u043b\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432\u0438\u0434\u0435\u043e \u0438 \u043b\u0435\u0436\u0438\u0442 \u043e\u043d\u043e <a href=\"https:\/\/disk.yandex.ru\/i\/Lhni5WZTT8Lg9g\" rel=\"nofollow noopener noreferrer\">\u0442\u0443\u0442<\/a><\/p>\n<h3>R2dbc-\u043f\u043e\u0434\u0445\u043e\u0434<\/h3>\n<p>  <\/p>\n<blockquote><p><b>The Reactive Relational Database Connectivity (R2DBC)<\/b> \u043f\u0440\u0438\u043d\u0451\u0441 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 API \u0434\u043b\u044f \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445<\/p><\/blockquote>\n<p>  \u041e \u043d\u0451\u043c \u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043d\u0430 \u0425\u0430\u0431\u0440\u0435. \u041f\u0435\u0440\u0432\u043e\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/r2dbc.io\/\" rel=\"nofollow noopener noreferrer\">r2dbc.io<\/a><\/p>\n<p>  \u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0442\u0435\u043a \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430: Spring Boot + Web Flux + R2dbc PostgreSQL Driver<\/p>\n<p>  \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 build.gradle.kt \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c:<\/p>\n<pre><code class=\"kotlin\"> dependencies { ...     implementation(\"org.springframework.boot:spring-boot-starter-webflux\")     runtimeOnly(\"io.r2dbc:r2dbc-postgresql\") }  <\/code><\/pre>\n<p>  <b>spring-boot-starter-webflux<\/b> \u2014 \u044d\u0442\u043e \u0441\u0442\u0430\u0440\u0442\u0435\u0440 spring WebFlux, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u043e\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u043c \u0438 \u043d\u0435\u0441\u0451\u0442 \u0432 \u0441\u0435\u0431\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u00ab\u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e\u00bb \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.<\/p>\n<p>  <b>r2dbc-postgresql<\/b> \u2014 r2dbc \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0434\u043b\u044f postgreSQL<\/p>\n<p>  \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0443\u0436\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u043e\u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0440\u0443\u0433\u043e\u0439, \u0434\u0430 \u0438 \u0441\u0430\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f DSLContext \u0438\u043d\u043e\u0439:<\/p>\n<p>  <b>aplication.yml<\/b>  <\/p>\n<pre><code class=\"bash\">spring:   r2dbc:     url: r2dbc:postgresql:\/\/localhost:5432\/jooq_test     password: postgres     username: postgres     pool:       initial-size: 3       max-size: 10       max-idle-time: 30m   jooq:     sql-dialect: postgres <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"kotlin\">@Configuration class JooqConfiguration(     private val connectionFactory: ConnectionFactory ) {      @Bean(value = [\"r2dbcDSLContext\"])     fun createContext(): DSLContext {         return DSL.using(connectionFactory)     } ... } <\/code><\/pre>\n<p>  \u041c\u0435\u0442\u043e\u0434 \u0432 Repository \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0447\u0435\u0440\u0435\u0437 Spring Reactor \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443:<\/p>\n<pre><code class=\"kotlin\">@Repository class SampleRepository(     @Qualifier(\"r2dbcDSLContext\")     private val r2dbcDSLContext: DSLContext,     @Qualifier(\"jdbcDSLContext\")     private val jdbcDSLContext: DSLContext ) {  ...      fun getReactiveJooq(queryTime: LocalDateTime, limit: Long): Flux&lt;ResultDto> {         return Flux.from(getQuery(r2dbcDSLContext, limit))             .map { r ->                 ResultDto(                     queryTime = queryTime,                     dataTime = LocalDateTime.now(),                     dataDto = r.into(d).into(DataDto::class.java)                 )             }     } ... } <\/code><\/pre>\n<p>  <b>Flux<\/b> \u2014 \u044d\u0442\u043e stream \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u0442 0 \u0434\u043e N \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043f\u043e\u0442\u043e\u043a. \u041e\u043d \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u0435\u0439\u0441\u0430. Flux \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0442 Publisher, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u043f\u043e\u0442\u043e\u043a. \u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/projectreactor.io\/docs\/core\/release\/api\/reactor\/core\/publisher\/Flux.html\" rel=\"nofollow noopener noreferrer\">\u0442\u0443\u0442<\/a><\/p>\n<p>  \u041c\u0435\u0442\u043e\u0434 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u0432\u0438\u0434\u0435\u043b\u0438 \u0432 Jdbc-\u043f\u043e\u0434\u0445\u043e\u0434\u0435, \u0441 \u043e\u0434\u043d\u0438\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c: \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u2014 stream.<\/p>\n<p>  \u0421\u043b\u043e\u0439 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 c JDBC \u0442\u043e\u0436\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c:<\/p>\n<pre><code class=\"kotlin\">@Service class SampleService(private val sampleRepository: SampleRepository) {      fun getReactiveJooq(queryTime: LocalDateTime, limit: Long): Flux&lt;ResultDto> {         return sampleRepository.getReactiveJooq(queryTime, limit)     } ... } <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0448 \u043c\u0435\u0442\u043e\u0434 \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f.<\/p>\n<p>  \u0421\u043b\u043e\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0432 WebFlux \u0438\u043c\u0435\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0432 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u0441 MVC. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0439 \u043d\u0430\u043c <b>Content-Type: application\/json<\/b> \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0432\u044b\u0437\u043e\u0432. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <b>Content-Type: application\/x-ndjson<\/b> \u0434\u043b\u044f \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u0430 \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0440\u0430\u0437\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u043d\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439. \u041e\u043d \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438.<\/p>\n<pre><code class=\"kotlin\">@RestController class SampleController(private val sampleService: SampleService) {       @GetMapping(\"\/sample\/jooq-reactive\", produces = [MediaType.APPLICATION_NDJSON_VALUE])     fun jooqReactive(@RequestParam limit: Long): Flux&lt;ResultDto> {         return sampleService.getReactiveJooq(LocalDateTime.now(), limit)     }  ...  } <\/code><\/pre>\n<p>  Curl \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"bash\"> curl http:\/\/localhost:8080\/sample\/jooq-reactive?limit=1000000 <\/code><\/pre>\n<p>  \u0412\u0438\u0434\u0435\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 R2dbc \u0432\u044b\u043b\u043e\u0436\u0435\u043d\u043e <a href=\"https:\/\/disk.yandex.ru\/i\/jihJb9QB_-oqrA\" rel=\"nofollow noopener noreferrer\">\u0442\u0443\u0442<\/a><\/p>\n<h3>\u0421\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437<\/h3>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043d\u0430\u0448\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a\u0430\u044f \u00ab\u043a\u0430\u0440\u0442\u0438\u043d\u0430\u00bb. \u0411\u0443\u0434\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c 1 \u043c\u043b\u043d. \u0441\u0442\u0440\u043e\u043a \u043a\u0430\u043a \u0434\u043b\u044f <i>jooq-blocking<\/i>, \u0442\u0430\u043a \u0438 \u0434\u043b\u044f <i>jooq-reactive<\/i><\/p>\n<h4>\u041f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438<\/h4>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/gb\/yg\/tu\/gbygtucjhplmxtqvc7epvoeqpss.png\" data-src=\"https:\/\/habrastorage.org\/webt\/gb\/yg\/tu\/gbygtucjhplmxtqvc7epvoeqpss.png\"\/><\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/jd\/54\/v9\/jd54v9dkxsvr5rhvgjroejdwfuw.png\" data-src=\"https:\/\/habrastorage.org\/webt\/jd\/54\/v9\/jd54v9dkxsvr5rhvgjroejdwfuw.png\"\/><\/p>\n<p>  \u041d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0451\u043d Jdbc \u0437\u0430\u043f\u0443\u0441\u043a, \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u043c R2dbc<\/p>\n<h4>\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 CPU<\/h4>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/h-\/ly\/d5\/h-lyd5pkog3j4a8p7dv0uv8y24y.png\" data-src=\"https:\/\/habrastorage.org\/webt\/h-\/ly\/d5\/h-lyd5pkog3j4a8p7dv0uv8y24y.png\"\/><\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/h3\/un\/s7\/h3uns7t0dxzfwxxr6xa6z8ewp7a.png\" data-src=\"https:\/\/habrastorage.org\/webt\/h3\/un\/s7\/h3uns7t0dxzfwxxr6xa6z8ewp7a.png\"\/><\/p>\n<p>  \u041d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0451\u043d Jdbc \u0437\u0430\u043f\u0443\u0441\u043a, \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u043c R2dbc<\/p>\n<h4>\u0412\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f<\/h4>\n<p>  <b>Jdbc<\/b>  <\/p>\n<pre><code class=\"bash\">GET http:\/\/localhost:8080\/sample\/jooq-blocking?limit=1000000  HTTP\/1.1 200 OK Content-Type: application\/json Content-Length: 279170577  > 2021-11-18T181435.200.json  Response code: 200 (OK); Time: 25541ms; Content length: 273258295 bytes<\/code><\/pre>\n<p>  <b>R2dbc<\/b>  <\/p>\n<pre><code class=\"bash\">GET http:\/\/localhost:8080\/sample\/jooq-reactive?limit=1000000  HTTP\/1.1 200 OK transfer-encoding: chunked Content-Type: application\/x-ndjson  > 2021-11-18T180754.200.txt  Response code: 200 (OK); Time: 47203ms; Content length: 279975556 bytes <\/code><\/pre>\n<p>  <\/p>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>  \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0441\u0430\u043c\u044b\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435. \u041a\u0442\u043e-\u0442\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u2014 \u0431\u0443\u0434\u0443\u0449\u0435\u043c, \u043a\u0442\u043e-\u0442\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u043c, \u0430 \u043a\u0442\u043e-\u0442\u043e \u0438 \u0432\u043e\u0432\u0441\u0435 \u043d\u0435\u043d\u0443\u0436\u043d\u043e\u0439 \u0444\u0438\u0447\u0435\u0439. \u0421\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u043f\u043e\u043a\u0430\u0437\u0430\u043b, \u0447\u0442\u043e \u0432 \u0446\u0435\u043b\u043e\u043c Spring MVC \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0441 \u0437\u0430\u0434\u0430\u0447\u0435\u0439, \u043e\u0434\u043d\u0430\u043a\u043e Spring WebFlux + r2dbc \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/589727\/\"> https:\/\/habr.com\/ru\/articles\/589727\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\u041f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e!<\/p>\n<p>  \u041d\u0430 \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u0438\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043b\u0435\u0442 \u043c\u043e\u0435\u0433\u043e \u043e\u043f\u044b\u0442\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u041f\u041e, \u043d\u0435 \u0440\u0430\u0437 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0441\u044f \u0441 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0435\u0439, \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 SQL-\u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0437\u0434\u043e\u0440\u043e\u0432\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0442\u044c \u0438 \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0430 \u0444\u0440\u043e\u043d\u0442, \u044f \u043d\u0430\u043f\u0438\u0448\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443. \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0434\u0432\u0443\u043c\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u043c\u0438, \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440: R2DBC \u0438 JDBC<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-405650","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/405650","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=405650"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/405650\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=405650"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=405650"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=405650"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}