الانتقال إلى المحتوى الرئيسي
ينفّذ clickhouse-jdbc واجهة JDBC القياسية باستخدام أحدث عميل Java. نوصي باستخدام أحدث عميل Java مباشرةً إذا كانت الأولوية القصوى للأداء أو للوصول المباشر.

متطلبات البيئة

الإعداد

إذا كنت تستخدم JDBC driver ضمن تطبيق يستلزم إضافة ملف jar إلى classpath، فستحتاج إلى تنزيل ملف jar من:

الإعداد

فئة برنامج التشغيل: com.clickhouse.jdbc.ClickHouseDriver
com.clickhouse.jdbc.ClickHouseDriver هي فئة واجهة للإصدارين الجديد والقديم من JDBC. وتستخدم تنفيذ JDBC الجديد افتراضيًا. يمكنك استخدام تنفيذ JDBC القديم من خلال تعيين خاصية systemclickhouse.jdbc.v1 إلى true. ويجب تعيين هذه الخاصية قبل استدعاء فئة Driver.والطريقة البديلة للتبديل بين الإصدارين هي استخدام فئات Driver الخاصة بكل إصدار مباشرةً:
  • com.clickhouse.jdbc.Driver هو تنفيذ JDBC الجديد (V2).
  • com.clickhouse.jdbc.DriverV1 هو تنفيذ JDBC القديم (V1).
صياغة URL: jdbc:(ch|clickhouse)[:<protocol>]://endpoint[:port][/<database>][?param1=value1&param2=value2][#tag1,tag2,...]، على سبيل المثال:
  • jdbc:clickhouse:http://localhost:8123
  • jdbc:clickhouse:https://localhost:8443?ssl=true
ثمة بعض الأمور الجديرة بالملاحظة حول صياغة URL:
  • يُسمح بوجود نقطة نهاية واحدة فقط في URL
  • يجب تحديد البروتوكول إذا لم يكن البروتوكول الافتراضي، وهو ‘HTTP’
  • يجب تحديد المنفذ إذا لم يكن المنفذ الافتراضي ‘8123’
  • لا يستنتج المُشغِّل البروتوكول من المنفذ، لذا يجب تحديده صراحةً
  • لا تكون المعلَمة ssl مطلوبة عند تحديد البروتوكول.

خصائص الاتصال

تُعرَّف معاملات الإعداد الرئيسية في Java client، وينبغي تمريرها كما هي إلى driver. يمتلك driver بعض الخصائص الخاصة به التي لا تندرج ضمن إعداد client، وهي مُدرجة أدناه.خصائص برنامج التشغيل:
إعدادات الخادميجب أن تبدأ جميع إعدادات الخادم بالبادئة clickhouse_setting_ (كما في تهيئة العميل).
مثال على الإعداد:
وهو ما يعادل URL الخاص بـ JDBC التالي:
ملاحظة: لا حاجة إلى ترميز URL لـ JDBC URL أو الخصائص، إذ سيُجرى ترميزها تلقائيًا.ملفات تعريف للقراءة فقطنتجنب عمدًا إضافة الإعدادات الافتراضية إلى خصائص الاتصال تفاديًا للمشكلات المرتبطة بملفات التعريف للقراءة فقط. غير أن بعض المستخدمين يحتاجون إلى تمرير إعدادات التنسيق (على سبيل المثال لقراءة JSON بوصفه String)، ونوصي في هذه الحالة باستخدام ملف التعريف readonly=2. اطّلع على مزيد من المعلومات حول ملفات التعريف للقراءة فقط هنا.

تعريف العميل

ثمة طريقتان لتحديد التطبيق الذي أنشأ الطلب: ضبط com.clickhouse.client.api.ClientConfigProperties#CLIENT_NAME عبر خصائص الاتصال، أو استخدام الأسلوب java.sql.Connection#setClientInfo(String name, String value).
showLineNumbers
showLineNumbers
كلتا الطريقتين ستُفضيان إلى القيمة التالية لـ http_user_agent في سجل الاستعلام:
ملاحظة: نوصي باستخدام تنسيق app_name/version للخاصية client_name لأنه يُساعد في التعرف على التطبيق في سجل الاستعلامات.

تحديد العملية

يُنشئ JDBC driver معرّف query_id لكل عملية (يُضمَّن حاليًا في استثناءات الخادم).لتعيين log_comment لعملية ما، استخدم الـ method com.clickhouse.jdbc.StatementImpl#getLocalSettings. يستلزم ذلك تحويل Statement أو PreparedStatement إلى النوع com.clickhouse.jdbc.StatementImpl أولاً.
showLineNumbers
ملاحظة: يعمل هذا الأسلوب مع حالات الاستخدام أحادية الخيط للعبارة، لأن localSettings مشترك بين الخيوط.

أنواع البيانات المدعومة

يدعم JDBC driver نفس تنسيقات البيانات التي يدعمها Java client الأساسي.

تعيين أنواع JDBC

ينطبق التعيين التالي على:
  • ResultSet#getObject(columnIndex) - تُعيد الطريقة كائنًا من فئة Java المقابلة. (Int8 -> java.lang.Byte, Int16 -> java.lang.Short, إلخ.)
  • ResultSetMetaData#getColumnType(columnIndex) - تُعيد الطريقة نوع JDBC المقابل. (Int8 -> java.lang.Byte, Int16 -> java.lang.Short, إلخ.)
ثمة بعض الطرق لتغيير التعيين:
  • ResultSet#getObject(columnIndex, class) - ستحاول هذه الطريقة تحويل القيمة إلى النوع class. توجد بعض القيود على هذا التحويل. راجع كل قسم للاطلاع على التفاصيل.
الأنواع الرقمية
  • الأنواع الرقمية قابلة للتحويل فيما بينها. لذا يمكن الحصول على Int8 بصيغة Float64 والعكس صحيح.:
    • سيُرجع rs.getObject(1, Float64.class) قيمة Float64 من Int8 column.
    • سيُرجع rs.getLong(1) قيمة Long من Int8 column.
    • يمكن أن يُرجع rs.getByte(1) قيمة Byte من Int16 column إذا كانت ضمن نطاق Byte.
  • لا يُنصح بالتحويل من نوع أوسع إلى نوع أضيق بسبب خطر تلف البيانات.
  • يتعامل النوع Bool أيضًا على أنه عدد.
  • يمكن قراءة جميع الأنواع العددية على أنها java.lang.String.
  • توجد مشكلة عند تخزين Float.MAX_VALUE في Java بوصفه Float (https://github.com/ClickHouse/clickhouse-java/issues/809). ويؤدي حفظ القيمة نفسها بوصفها Double إلى حل هذه المشكلة.
أنواع String
  • لا يمكن قراءة String إلا باعتباره java.lang.String أو byte[].
  • تُقرأ FixedString كما هي، وتُحشى بأصفار حتى يصل طولها إلى طول العمود. (على سبيل المثال، ستُقرأ FixedString(10) للقيمة 'John' على أنها 'John\0\0\0\0\0\0\0\0\0'.)
أنواع Enum
  • يُعيَّن Enum8 وEnum16 إلى java.lang.String افتراضيًا.
  • يمكن قراءة قيم Enum كقيم رقمية باستخدام دالة getter المخصّصة أو الدالة getObject(columnIndex, Integer.class).
  • يُعيَّن Enum16 داخليًا إلى short، ويُعيَّن Enum8 إلى byte. ويجب تجنّب قراءة Enum16 على أنه byte بسبب خطر تلف البيانات.
  • يمكن تعيين قيم Enum كسلسلة نصية أو كقيمة رقمية في PreparedStatement.
أنواع التاريخ/الوقت
  • تُطابَق أنواع Date / Time مع أنواع java.sql لتحسين التوافق مع JDBC. ومع ذلك، يمكن أيضًا الحصول على java.time.LocalDate وjava.time.LocalDateTime وjava.time.LocalTime باستخدام ResultSet#getObject(columnIndex, Class<T>) مع تمرير الفئة المقابلة بوصفها الوسيط الثاني.
    • ستُعيد rs.getObject(1, java.time.LocalDate.class) القيمة java.time.LocalDate من العمود Date.
    • ستُعيد rs.getObject(1, java.time.LocalDateTime.class) القيمة java.time.LocalDateTime من العمود DateTime.
    • ستُعيد rs.getObject(1, java.time.LocalTime.class) القيمة java.time.LocalTime من العمود Time.
  • لا تتأثر Date وDate32 وTime وTime64 بالمنطقة الزمنية للخادم.
  • يتأثر DateTime وDateTime64 بالمنطقة الزمنية للخادم أو بالمنطقة الزمنية للجلسة.
  • يمكن استرجاع DateTime وDateTime64 كـ ZonedDateTime باستخدام getObject(colIndex, ZonedDateTime.class).
الأنواع المتداخلة
  • يُعيَّن Array إلى java.sql.Array افتراضيًا لضمان التوافق مع JDBC. ويُجرى ذلك أيضًا لتوفير مزيد من المعلومات عن قيمة المصفوفة المُعادة. وهذا مفيد في استدلال النوع.
  • يوفّر Array التابع getResultSet() لإرجاع java.sql.ResultSet بالمحتوى نفسه الموجود في المصفوفة الأصلية.
  • لا ينبغي قراءة أنواع المجموعات باعتبارها java.lang.String لأن هذه ليست طريقة صالحة لتمثيل البيانات (على سبيل المثال: لا تُوضَع قيم السلاسل النصية بين علامتَي اقتباس في المصفوفة).
  • يُعيَّن Map إلى OTHER لأن القيمة لا يمكن قراءتها إلا باستخدام الطريقة getObject(columnIndex, Class<T>).
    • لا يُعَدّ Map من نوع java.sql.Struct لأنه لا يحتوي على أعمدة مُسمّاة.
  • يتم تمثيل Tuple على شكل Object[] لأنه قد يحتوي على أنواع مختلفة، كما أن استخدام List غير صالح.
  • يمكن قراءة Tuple باعتباره Array باستخدام الطريقة getObject(columnIndex, Array.class). في هذه الحالة، ستُعيد Array#baseTypeName تعريف العمود Tuple.
بيانات وصفية لنوع عنصر المصفوفةتُعيد Array.getBaseTypeName() اسم نوع العنصر في ClickHouse؛ وتُعيد Array.getBaseType() رمز نوع JDBC. يحتفظ JDBC V2 بتوقيعات النوع الكاملة (أنواع المُغلِّف، ومعاملات النوع) التي يحذفها V1.قواعد التعيين العامة للمصفوفات هي:ملاحظات حول القواعد أعلاه:
  • يتم الاحتفاظ بالأنواع المغلِّفة (Nullable, LowCardinality) في getBaseTypeName()، لكن getBaseType() يُرجِع رمز JDBC للنوع الداخلي.
  • تُسطَّح المصفوفات المتداخلة في البيانات الوصفية: يُرجِع getBaseTypeName() نوع العنصر الأعمق غير المصفوفي، وليس العنصر الفرعي المباشر.
  • تحتفظ الأنواع ذات المعلمات (FixedString(N)، والتعريفات الكاملة لـ Enum/Tuple) بمعلماتها في getBaseTypeName().
أمثلة:
  • في V2، تحتفظ getBaseTypeName() بتوقيع النوع الكامل، بما في ذلك أنواع التغليف (Nullable وLowCardinality) ومعلّمات النوع (FixedString(8) وتعريفات Enum وTuple الكاملة). أما V1 فيُزيل هذه ويُرجع اسم النوع الأساسي فقط.
  • تستخدم مصفوفات Tuple القيمة OTHER (1111) في V2 بدلًا من STRUCT (2002) لأن Tuple في ClickHouse تتضمن حقولًا مسمّاة، وهو ما لا يدعمه java.sql.Struct.
  • تستخدم مصفوفات UUID القيمة OTHER (1111) في V2، بما يتوافق مع تعيين UUID القياسي.
  • تُعيَّن قيم Enum إلى VARCHAR — إذ تُحدَّد عناصر enum باسمها النصي بغضّ النظر عن ترميزها الرقمي الأساسي.
كتابة Arraysاستخدم java.sql.Connection#createArrayOf لإنشاء كائن java.sql.Array. صُمِّم هذا الكائن لتوحيد التعامل مع المصفوفات عبر قواعد البيانات المختلفة. يُعدّ الاتصال ضروريًا لتمرير الإعدادات إلى أسلوب المصنع الخاص بـ Array.تقبل الطريقة وسيطَين:
  • typeName - اسم نوع عناصر المصفوفة. على سبيل المثال Array(Int32) -> "Int32".
  • elements - عناصر المصفوفة نفسها. على سبيل المثال [[1, 2, 3], [4, 5, 6]] -> new Integer[][] {{1, 2, 3}, {4, 5, 6}}.
يمكن تمثيل Tuple على هيئة Object[] أو java.sql.Struct (راجع كيفية كتابة Tuples أدناه).مثال
قراءة المصفوفاتاستخدم ResultSet#getArray(columnIndex) لقراءة كائن Array. يمكن استخدام هذا الكائن للوصول إلى مصفوفة بأي عمق تداخل. يمكن استخدام الأسلوب Array#getResultSet() لقراءة عناصر المصفوفة بطريقة أكثر توحيدًا من خلال java.sql.ResultSet، وهو مفيد عندما يكون النوع الدقيق لعناصر المصفوفة غير معروف.مثال
كتابة Tuplesيتم تعيين Tuples إلى كائن com.clickhouse.data.Tuple وينبغي كتابتها بوصفها هذا الكائن عبر استدعاء الأسلوب setObject(columnIndex, tuple). يمكن استخدام كائن java.sql.Struct لكتابة tuples لتحقيق قدر أكبر من قابلية النقل.مثال
قراءة Tuplesستُعيد الدالة getObject(columnIndex) القيمة Object[]. يمكن قراءة Tuples بوصفها java.sql.Array باستخدام الدالة getObject(columnIndex, Array.class).مثال
كتابة الخرائطلا يمكن كتابة Map إلا على شكل كائن java.collections.Map، إذ يستلزم هذا النوع أزواج مفتاح-قيمة (لا يدعم java.sql.Struct أزواج مفتاح-قيمة).مثال
قراءة الخرائطيمكن قراءة Map كـ java.collections.Map object باستخدام method‏ getObject(columnIndex, Map.class).مثال
كتابة Nestedاستخدم java.sql.Connection#createStruct لإنشاء كائن java.sql.Struct. صُمِّم هذا الكائن لتوحيد التعامل مع البنى المتداخلة عبر قواعد البيانات المختلفة. يلزم توفر الاتصال لتمرير الإعدادات إلى دالة المصنع الخاصة بـ Struct.تقبل الدالة وسيطَين:
  • typeName - اسم نوع العناصر المتداخلة. على سبيل المثال Nested(Tuple(Int32, String)) -> "Nested(Tuple(Int32, String))".
  • elements - العناصر المتداخلة نفسها. على سبيل المثال [1, 'test'] -> new Object[] {1, 'test'}.
مثال
قراءة Nestedاستخدم ResultSet#getStruct(columnIndex, StructDescriptor) لقراءة كائن Nested. يمكن استخدام الكائن للوصول إلى العناصر المتداخلة بأي مستوى من مستويات التداخل. يمكن استخدام الدالة Struct#getResultSet() لقراءة العناصر المتداخلة بأسلوب أكثر توحيدًا عبر java.sql.ResultSet، وهو مفيد عندما يكون النوع الدقيق للعناصر المتداخلة غير معروف.مثال
أنواع Geoأنواع Nullable وLowCardinality
  • Nullable و LowCardinality نوعان خاصّان يغلّفان أنواعًا أخرى.
  • يؤثّر Nullable على كيفية إرجاع أسماء الأنواع في ResultSetMetaData
الأنواع الخاصة
  • لا يُعد UUID نوعًا قياسيًا في JDBC. لكنه جزء من JDK. بشكل افتراضي، يُعاد java.util.UUID من الطريقة getObject().
  • يمكن قراءة UUID وكتابته على هيئة String باستخدام الطريقة getObject(columnIndex, String.class).
  • لا يُعد IPv4 وIPv6 نوعين قياسيين في JDBC. لكنهما جزء من JDK. بشكل افتراضي، يُعاد java.net.Inet4Address وjava.net.Inet6Address من الطريقة getObject().
  • يمكن قراءة IPv4 وIPv6 وكتابتهما على هيئة String باستخدام الطريقة getObject(columnIndex, String.class).
نوع JSONيُعيَّن JSON type إلى Map<String, Object> افتراضيًا، حيث تكون مفاتيح JSON object هي keys وقيم JSON object هي values. على سبيل المثال:
سيتم تعيينه إلى:
ثمة خيار أكثر ملاءمةً لقراءة JSON بوصفه String عبر تمرير إعداد الخادم jdbc_read_json_as_string=true إلى خصائص الاتصال. يجعل هذا الـ driver يُعيد قيم JSON بوصفها String، ويمكن استخدامها لتحليل البيانات باستخدام أي مكتبة JSON.
بدءًا من الإصدار 25.8 من ClickHouse، لم تعد الأرقام مُقتبسةً بشكل افتراضي. بالنسبة للإصدارات الأقدم، يمكنك تعطيل الاقتباس عبر تمرير إعدادات الخادم إلى خصائص الاتصال:

التعامل مع التواريخ والأوقات والمناطق الزمنية

يُرجى الاطلاع على دليل التاريخ والوقت الذي يشرح الأخطاء الشائعة ومنطق عمل الـ driver عند التعامل مع قيم التاريخ والوقت والـ timestamps.

إنشاء اتصال

توفير بيانات الاعتماد والإعدادات

showLineNumbers

عبارة بسيطة

showLineNumbers

إدراج

showLineNumbers

HikariCP

showLineNumbers

مزيد من المعلومات

لمزيد من المعلومات، راجع مستودع GitHub الخاص بنا ووثائق Java Client.

استكشاف الأخطاء وإصلاحها

التسجيل

يستخدم برنامج التشغيل slf4j للتسجيل، وسيستخدم أول تطبيق متاح على classpath.

حل مشكلة انتهاء مهلة JDBC عند عمليات الإدراج الكبيرة

عند تنفيذ عمليات إدراج كبيرة في ClickHouse ذات أوقات تنفيذ طويلة، قد تواجه أخطاء انتهاء مهلة JDBC مثل:
قد تُعطّل هذه الأخطاء عملية إدراج البيانات وتؤثر على استقرار النظام. لمعالجة هذه المشكلة، قد تحتاج إلى ضبط بعض إعدادات المهلة الزمنية في نظام تشغيل العميل.

Mac OS

على نظام Mac OS، يمكن تعديل الإعدادات التالية لحل المشكلة:
  • net.inet.tcp.keepidle: 60000
  • net.inet.tcp.keepintvl: 45000
  • net.inet.tcp.keepinit: 45000
  • net.inet.tcp.keepcnt: 8
  • net.inet.tcp.always_keepalive: 1

Linux

على Linux، قد لا تكفي الإعدادات المكافئة وحدها لحل المشكلة. ويعود ذلك إلى الاختلافات في طريقة تعامل Linux مع إعدادات keep-alive للمقبس، مما يستوجب اتخاذ خطوات إضافية. اتبع الخطوات التالية:
  1. عدّل معلمات نواة Linux التالية في /etc/sysctl.conf أو في ملف تهيئة ذي صلة:
  • net.inet.tcp.keepidle: 60000
  • net.inet.tcp.keepintvl: 45000
  • net.inet.tcp.keepinit: 45000
  • net.inet.tcp.keepcnt: 8
  • net.inet.tcp.always_keepalive: 1
  • net.ipv4.tcp_keepalive_intvl: 75
  • net.ipv4.tcp_keepalive_probes: 9
  • net.ipv4.tcp_keepalive_time: 60 (قد ترغب في خفض هذه القيمة من القيمة الافتراضية البالغة 300 ثانية)
  1. بعد تعديل معلمات النواة، طبِّق التغييرات عن طريق تشغيل الأمر التالي:
بعد ضبط هذه الإعدادات، تحتاج إلى التأكد من أن الـ client لديك يُفعّل خيار Keep Alive على الـ socket:

دليل الترحيل

التغييرات الرئيسية

  • صُمم JDBC V2 ليكون أخف، وأزيلت منه بعض الميزات.
    • البيانات المتدفقة غير مدعومة في JDBC V2 لأنها ليست جزءًا من مواصفة JDBC ولا من Java.
  • يتطلب JDBC V2 إعدادًا صريحًا. لا توجد إعدادات افتراضية للتجاوز التلقائي.
    • يجب تحديد البروتوكول في عنوان URL. لا يتم اكتشاف البروتوكول ضمنيًا بالاعتماد على أرقام المنافذ.

تغييرات الإعداد

يوجد نوعان فقط من أنواع enum:
  • com.clickhouse.jdbc.DriverProperties - خصائص التهيئة الخاصة ببرنامج التشغيل.
  • com.clickhouse.client.api.ClientConfigProperties - خصائص تهيئة العميل. التغييرات على تهيئة العميل موضحة في وثائق Java Client.
يتم تحليل خصائص الاتصال على النحو التالي:
  • يُحلَّل URL أولًا لاستخراج الخصائص. وتتجاوز هذه الخصائص جميع الخصائص الأخرى.
  • لا تُمرَّر خصائص برنامج التشغيل إلى العميل.
  • تُستخرَج نقاط النهاية (host وport وprotocol) من URL.
مثال:

تغييرات أنواع البيانات

الأنواع الرقمية
  • أكبر اختلاف هو أن الأنواع غير الموقَّعة تُحوَّل إلى أنواع Java لتحسين قابلية النقل.
أنواع السلاسل النصية
  • تتم قراءة FixedString كما هي في كلا الإصدارين. على سبيل المثال، ستُقرأ FixedString(10) للقيمة 'John' على أنها 'John\0\0\0\0\0\0\0\0\0'.
  • عند استخدام PreparedStatement#setBytes، سيتم تحويله إلى unhex('<hex_string>') ثم تُقرأ القيمة كنوع String.
  • تُخزَّن السلاسل النصية بترميز UTF-8.
أنواع التاريخ/الوقت
  • يقتصر دعم Time وTime64 في V2 على كونهما نوعين جديدين.
  • يُحوَّل DateTime وDateTime64 إلى java.sql.Timestamp لتحقيق توافق أفضل مع JDBC.
أنواع Enumالأنواع المتداخلة
  • في V2، يُعيَّن Array إلى java.sql.Array افتراضيًا لضمان التوافق مع JDBC. ويُجرى ذلك أيضًا لتوفير معلومات إضافية عن قيمة المصفوفة المُعادة. وهذا مفيد في type inference.
  • في V2، يطبّق Array الطريقة getResultSet() لإرجاع java.sql.ResultSet بالمحتوى نفسه الموجود في المصفوفة الأصلية.
  • يستخدم V1 STRUCT مع Map، لكنه يعيد دائمًا الكائن java.util.Map. ويعالج V2 ذلك من خلال تعيين Map إلى JAVA_OBJECT.
  • يستخدم V1 STRUCT مع Tuple، لكنه يعيد دائمًا الكائن List<Object>. ويُعيّن V2 Tuple إلى OTHER ويعيد Object[] افتراضيًا.
  • يقدّم V2 ‏com.clickhouse.data.Tuple#Tuple لكتابة قيم tuple. وهذا يسهّل تحديد ما إذا كانت القيمة tuple أم مصفوفة.
  • لا يمكن استخدام PreparedStatement#setBytes وResultSet#getBytes مع أنواع المجموعات. فقد صُمّمت هاتان الطريقتان للعمل مع السلاسل الثنائية.
  • عادةً ما يُستخدم java.sql.Array لكتابة أنواع Array وقراءتها. ويوفّر JDBC driver دعمًا كاملًا لذلك.
  • في V2، يُعيَّن Nested إلى Array ويعرضه كمصفوفة من tuples.
  • يوفّر V2 دعمًا جزئيًا لـ java.sql.Struct لأنه يشبه جدًا النوع Array ولا يدعم key-value pairs. ويمكن استخدام Struct لكتابة قيم Tuple.
أنواع Geoأنواع Nullable وLowCardinality
  • Nullable وLowCardinality نوعان خاصّان يغلّفان أنواعًا أخرى.
  • لا تطرأ أي تغييرات على هذين النوعين في V2.
الأنواع الخاصة
  • يستخدم V1 النوع VARCHAR مع UUID، لكنه يعيد دائمًا الكائن java.util.UUID. ويعالج V2 هذا الأمر من خلال تعيين UUID إلى OTHER، ثم يعيد الكائن java.util.UUID.
  • يستخدم V1 النوع VARCHAR مع IPv4 وIPv6، لكنه يعيد دائمًا الكائنين java.net.Inet4Address وjava.net.Inet6Address. ويعالج V2 هذا الأمر من خلال تعيين IPv4 وIPv6 إلى OTHER، ثم يعيد الكائنين java.net.Inet4Address وjava.net.Inet6Address.
  • Dynamic وVariant نوعان جديدان في V2. ولا يدعمهما V1.
  • يعتمد JSON على النوع Dynamic. لذلك فهو مدعوم فقط في V2.
  • يمكن قراءة قيم IPv4 وIPv6 على هيئة byte[] باستخدام الدالة getBytes(columnIndex). ومع ذلك، يُوصى باستخدام الفئات المخصّصة لهذه الأنواع.
  • لا يدعم V2 قراءة عنوان IP على أنه من القيم العددية، لأن التحويل مُنفَّذ بصورة أفضل في فئات InetAddress.

تغييرات البيانات الوصفية لقاعدة البيانات

  • يستخدم V2 المصطلح Schema فقط لتسمية قواعد البيانات. أما المصطلح Catalog فمحجوز للاستخدام المستقبلي.
  • يعيد V2 القيمة false لكل من DatabaseMetaData.supportsTransactions() وDatabaseMetaData.supportsSavepoints(). سيتغير ذلك في الإصدارات القادمة.
  • في DatabaseMetaData.getTypeInfo()، يُرجِع العمودان LITERAL_PREFIX وLITERAL_SUFFIX الآن القيمة null لأنواع البيانات التي لا يُتوقع أن تحتوي على بادئات أو لاحقات (مثل الأنواع الرقمية). في V1، كانت هذه الأعمدة تُرجِع قيماً غير null لهذه الأنواع. ينبغي استخدام هذه الأعمدة عند إنشاء استعلامات SQL لوضع القيم الحرفية بين علامتي اقتباس بشكل صحيح وفقاً لنوع بياناتها.
آخر تعديل في ٢٥ يونيو ٢٠٢٦