هناك مشاريع مفتوحة المصدر والتي أصبحت ناجحة تجاريًا ، مثل PostgreSQL / Elasticsearch. آخرون ، على سبيل المثال RethinkDB ، فقدوا السوق وأوقفوا التطوير. ومشروع قاعدة بيانات H2 لقاعدة بيانات مدمجة مكتوبة بلغة جافا قيد التطوير وتعيش في مكانها المناسب.
لإظهار وظائف SonarQube و Jira و Confluence ، يتم استخدام قاعدة بيانات H2 في البداية. H2 هو الأساس لتشغيل اختبارات SQL في الذاكرة في أي مشروع JVM تقريبًا. يوجد مثال لتطبيق أقل شهرة بالنسبة للمستخدمين - هذا هو استخدام H2 في نظام الإشعال - sql الموزع وهذا بالفعل نص برمجي جاهز للإنتاج لاستخدام قاعدة بيانات مدمجة كجزء من حل آخر. منذ أقل من شهر ، تم إصدار الإصدار
1.4.199 والذي يمكنك الآن من خلاله كتابة استعلامات SQL معقدة إلى حد ما.
في المشروعات ، لم أعتمد على H2 كقاعدة بيانات كاملة مع حفظ البيانات على القرص. بدلاً من ذلك ، كوحدة نمطية لتحويل البيانات في ذاكرة JVM ، مع دعم SQL جيد. ولكن بالنسبة لهذا التطبيق ، كان محدودا إلى حد كبير بسبب عدم وجود
وظائف النافذة . والآن ، بعد أكثر من نصف عام منذ بداية التطوير
الوظيفي ، أصبحت H2database الآن قد استوعبت
SQLite . وهذا يرجع إلى الميزة الكبيرة التي يتمتع بها
يفغيني ريازانوف من إيركوتسك - لم أر مثل هذا التطور السريع مثله من قبل في مشاريع مفتوحة المصدر غير هادفة للربح. أيضًا ، تظهر التزامات المساهمين الناطقين بالروسية بانتظام في مستودع المشروع. وفي لحظات الإفراج - مؤسس مشروع
توماس مولر .
H2 لديه دعم
للاستعلامات العودية (CTE) . هذه هي الطريقة القياسية في SQL للعمل مع البيانات التسلسلية في الجداول وتحلل الاستعلام (هنا يمكنك التنقيب عن مجدول الجدولة). الاستعلامات العودية موصوفة
في المنشور مع أمثلة.
للعمل مع بيانات سيئة التنظيم ، سيظهر تطبيق قادم لـ
SQL / JSON القياسي . في غضون ذلك ، لتلبية احتياجاتها ، وسعت H2 بمساعدة وظيفة مخصصة XQuery 3.1 المعالج على أساس
BaseX . الكود متوفر في مشروع جيثب
H2XQueryAdapter . هذه هي وظيفة الجدول التي يمكنها استخراج البيانات من تنسيق XML أو JSON باستخدام XQuery والتحقق من نوع وتقييد القيمة الخالية من القيم التي تم إرجاعها بواسطة الدالة. علاوة على ذلك ، تتوفر الطاقة الكاملة لتعبيرات SQL لتحويل نتيجة تحويل XQuery إلى ذاكرة عملية JVM.
يتم تحميل وظيفة الجدول xquery () بشكل زائد ولديها خياران - مع استعلام xQuery لمعلمة واحدة والآخر مع استعلام xQuery وسلسلة استعلام sql الثانية لتشكيل معلمات xQuery نفسها.
أثبت نهج مع هذه التحولات أن يكون ممتازا في مشروع لمعالجة حجم بيتابايت من البيانات الخام في مشروع
تخزين البيانات الطبية الحيوية .
create table xresult (GR VARCHAR(500) not null,AR varchar, VER VARCHAR(50)) as select * from xquery('declare variable $getHeader as xs:boolean external := false(); declare variable $getData as xs:boolean external := true(); <csv> { if($getHeader) then( <record><mavengr>VARCHAR(500) not null</mavengr><artifactname>varchar</artifactname><versionname>VARCHAR(50)</versionname></record> ), if($getData) then(( for $row in doc("http://central.maven.org/maven2/org/springframework/spring-context/5.1.4.RELEASE/spring-context-5.1.4.RELEASE.pom")//*:dependency return <record><mavengr>{$row/*:groupId/text()}</mavengr><artifactname>{$row/*:artifactId/text()}</artifactname><versionname>{$row/*:version/text()}</versionname></record> )) } </csv>')
يحتوي هذا التطبيق على قيود على تنسيق استعلام xquery.
من خلال تحليل نوع بيانات العمود ، حاولت إعادة استخدام محلل SQL من H2 ، لكن اتضح أنه مرتبط بشدة بكائنات قاعدة البيانات الأخرى لدرجة أنه رفض العمل دون إنشاء قاعدة بيانات وجلسة. أتعاطف مع الفكرة القائلة بأن المطورين فعلوا ذلك لتبسيط تصميم التطبيق وعدم عمل محلل لجميع المناسبات لأي قواعد نحوية من BNF.
يمكنك تشغيل
هذا المثال في وضع تصحيح java. يمكن تطوير قواعد تحويل جديدة في محرر xquery المألوف أو في
واجهة المستخدم الرسومية BaseX المفتوحة المصدر.
من الممكن تحويل أي مجموعة java أو POJO تقريبًا إلى جدول H2 افتراضي.
رمز المشروع
H2POJOTable على جيثب. في المثال ، حسب المرجع ، يتحول MemoryManagerMXBeans القائم على النظام الأساسي إلى وظيفة جدول H2. ربما يكون هذا النهج مريحًا لمن يشعرون بالحزن تجاه نقص LINQ ودعم العمليات على مجموعات في Java.
try (Statement statement = connection.createStatement()) { String pojoTableAlias = "create alias MemoryManagerMXBeans as $$ \n" + "import java.lang.management.ManagementFactory;\n" + "import java.lang.management.MemoryManagerMXBean;\n" + "import org.h2.expression.function.pojo.*;\n" + "import java.sql.*;\n" + "import java.util.Collections;\n" + "@CODE\n" + " ResultSet getRuntimeStat(Connection connection) throws Exception{\n" + " return H2PojoAdapter.toTable(connection, new CollectionWraper<>(MemoryManagerMXBean.class," + " ManagementFactory::getMemoryManagerMXBeans, Collections.emptyMap()));\n" + " }\n" + "\n$$"; statement.executeUpdate(pojoTableAlias); } try (Statement statement = connection.createStatement()) { try (ResultSet resultSet = statement.executeQuery("select * from MemoryManagerMXBeans()")) { int columnCount = assertResultSet(resultSet, new String[]{"memoryPoolNames", "name", "valid"}); assertThat(columnCount).isGreaterThan(1); } }
في بعض الأحيان تنهار الوظيفة القديمة في H2 ولا يطلبها المستخدمون. على سبيل المثال ، في مشاريع العمل الخاصة بي ، تقوم البرامج بقراءة البيانات من عنوان URL
AWS S3 . لذلك ، آمل أن
يظل الخطأ المعروف
ثابتًا بقبول
طلب السحب الخاص بي. في الطريق إلى إصلاح هذا الخطأ ، توجد اختبارات غير مستقرة لـ TLS ، والتي لا تعمل أيضًا تحت Java 11.
يسمح لك H2 باستخدام
برنامج تشغيل ODBC PostgreSQL لمضاهاة مجموعة فرعية من بروتوكول شبكته. والذي يسمح لك نظريًا بربطه من خلال FDW في PostgreSQL.
بالإضافة إلى قاعدة البيانات نفسها ، يتضمن تسليم H2 أيضًا وحدة تحكم ويب بسيطة مع دعم للإكمال التلقائي عند التحرير أو servlet أو خيار بدء التشغيل المستقل. يشبه H2 "السكين السويسري" للمطورين - أداة مدمجة ومتعددة الاستخدامات إذا كان مشروعك يستخدم بالفعل JVM. عند محاولة استخدام وحدة التحكم هذه مع برنامج تشغيل jdbc "ملتوية" ، قدم DBMS Redshift أول طلب سحب
ذو عيون حمراء في المشروع. ساعدني
نويل غرانين ، أحد المشاركين في المشروع ، في مراجعة الكود وقبلت التصحيحات.
إذا كنت بحاجة إلى نسخة تماثلية من Berkeley DB Java Edition - يحتوي المشروع على
MVStore - تخزين ثابت لبيانات القيمة الأساسية ، بالإضافة إلى MVCC ، يكون "المحرك" افتراضيًا في الإصدارات الحديثة من قاعدة البيانات. من اللافت للنظر أن قاعدة البيانات لديها حتى الدعم الأساسي
للوظائف الجغرافية والبحث عن
النص الكامل .
بفضل مساهمي H2database ، يستخدم الجميع قاعدة البيانات هذه ويبلغ عن الأخطاء! تم تطوير قاعدة بيانات H2 منذ عام 2005 ، وهي تدعم الآن وظائف النافذة ، واستعلامات العودية ، وهي واحدة من "محركات" SQL الأقوى لمعالجة البيانات في ذاكرة JVM ويتم توسيعها عن طريق وظائف الجدول للعمل مع البيانات المنظمة فضفاضة.