سؤال

لقد قمت بتنفيذ استعلام JDBC للحصول على مجموعة النتائج.قبل التكرار، أود أن أعرف بسرعة عدد الصفوف التي تم إرجاعها.كيف يمكنني القيام بذلك بأداء عالي؟

أنا أستخدم Java 6 وOracle 11g وأحدث برامج تشغيل Oracle JDBC.

هل كانت مفيدة؟

المحلول

وأنت تسير لديك للقيام بذلك كما استعلام منفصل، على سبيل المثال:

SELECT COUNT(1) FROM table_name

وبعض السائقين JDBC قد أقول لكم ولكن هذا هو السلوك اختياري، وأكثر لهذه النقطة، والسائق قد لا نعرف حتى الآن. وهذا يمكن أن يكون راجعا إلى كيفية تحسين الاستعلام مثل استراتيجيات التنفيذ المثال اثنين في أوراكل والحصول على كافة الصفوف في أسرع وقت ممكن أو للحصول على الصف الأول في أسرع وقت ممكن.

إذا كنت قيام اثنين من استعلامات منفصلة (واحد العد والآخر الاستعلام) ثم سوف تحتاج إلى القيام بها داخل نفس المعاملة. هذا وسوف تعمل بشكل جيد على أوراكل ولكن يمكن أن يكون مشكلة في قواعد البيانات الأخرى (وعلى سبيل المثال SQL خادم إما تظهر لك البيانات غير ملتزم أو كتلة على تحديث غير ملتزم الخارجي اعتمادا على مستوى العزل الخاصة بك في حين يدعم أوراكل مستوى العزلة التي تمنحك عرض transactionally متناسقة لل البيانات دون حظر على التحديثات الخارجية).

وعلى الرغم من أنه عادة لا يهم حقا عدد الصفوف هناك. عادة هذا النوع من الاستعلام إما دفعة معالجتها أو ترحيلها، وإما الطريقة يكون لديك تقدم المعلومات في شكل صفوف تحميل / معالجتها ويمكنك الكشف عن نهاية مجموعة النتائج (الواضح).

نصائح أخرى

ResultSet rs = stmt.executeQuery(sql);
int rowCount = rs.last() ? rs.getRow() : 0; // Number of rows in result set. Don't forget to set cyrsor to beforeFirst() row! :)

والجواب باختصار: لا يمكنك

والجواب طويل: كنت لا تستطيع، ويرجع ذلك جزئيا قاعدة بيانات يمكن تقييم بتكاسل الاستعلام، والعودة فقط الصفوف كما كنت أطلب منهم

وتحرير: استخدام resultset وتمرير يمكنك:)

والواقع، سألت هذا السؤال نفسه في جاوة قواعد البيانات الأخبار منذ فترة طويلة (في عام 2001!) وكان بعض <لأ href = "http://groups.google.com/group/comp.lang.java .databases / browse_frm / موضوع / f5142687a3d492fd / cda88f3b14649c8e "يختلط =" noreferrer "> ردود مفيدة .

لتحصل على عدد من الصفوف من JDBC:

ResultSet rs = st.executeQuery("select count(*) from TABLE_NAME");
rs.next();
int count = rs.getInt(1);

إذا السائق الخاص بك يدعم ذلك (!)، يمكنك الاتصال ResultSet.afterLast () ResultSet.getRow () ResultSet.beforeFirst (). قد الأداء أو قد لا تكون جيدة.

والحل الأفضل هو إعادة كتابة الخوارزمية الخاصة بك لا تتطلب حجم خط الهجوم.

بدون مشغل ثلاثي

rs.last();  // Moves the cursor to the last row in this ResultSet object.
int rowCount = rs.getRow();  //Retrieves the current row number.
rs.beforeFirst(); //Moves the cursor to the front of this ResultSet object,just before the first row.

مع المشغل الثلاثي سطر واحد

int rowCount = rs.last() ? rs.getRow() : 0; 
rs.beforeFirst();

والرمز:

//Create a Statement class to execute the SQL statement
Statement stmt = con.createStatement();

ResultSet rs = stmt.executeQuery("SELECT COUNT(*) AS COUNT FROM
TABLENAME");

 while(rs.next()) {
    System.out.println("The count is " + rs.getInt("COUNT"));
 }

 //Closing the connection
 con.close();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top