كيفية تحديد عدد الصفوف التي يتم إرجاعها من أوراكل في JDBC مصدر البيانات ؟

StackOverflow https://stackoverflow.com/questions/320299

  •  11-07-2019
  •  | 
  •  

سؤال

هل هناك طريقة للحد من الصفوف التي يتم إرجاعها في مصدر بيانات Oracle مستوى في هر التطبيق ؟

يبدو maxRows متاحة فقط إذا قمت بتعيين أنه على مصدر البيانات في جافا البرمجية.وضع maxRows="2" في مصدر البيانات لا ينطبق.

هل هناك أي طريقة أخرى تحد من الصفوف عاد ؟ دون رمز التغيير ؟

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

المحلول

وانها ليست شيئا ما هو متاح على مستوى التكوين. قد تحتاج إلى التحقق جيدا من أن يفعل ما تريد القيام به على أي حال: <لأ href = "http://java.sun.com/j2se/1.4.2/docs/api/java/sql/Statement.html# setMaxRows (دولي) "يختلط =" نوفولو noreferrer "> رؤية جافادوك لsetMaxRows . مع أوراكل انها لا تزال جارية لجلب كل الصف الخلفي للاستعلام ثم أهبط منها خارج النطاق. كنت بحاجة حقا إلى استخدام ROWNUM لجعلها تعمل بشكل جيد مع أوراكل وأنت لا تستطيع أن تفعل ذلك إما في التكوين.

نصائح أخرى

والسؤال هو لماذا تريد للحد من عدد الصفوف التي يتم إرجاعها. قد تكون هناك أسباب عديدة للقيام بذلك. سوف يكون أول لمجرد تحديد البيانات التي يتم إرجاعها بواسطة قاعدة البيانات. في رأيي هذا لا معنى له في معظم الحالات كما لو كنت ترغب في الحصول على بعض البيانات فقط ثم أود أن استخدام عبارة مختلفة أو إضافة شرط تصفية أو شيء من هذا. مثلا إذا كنت تستخدم ROWNUM أوراكل كنت لا تعرف بالضبط ما هي البيانات في الصفوف تحصل والبيانات التي لم يتم تضمين كما كنت أقول لقاعدة البيانات التي تريد الصف العاشر إلى y.
النهج الثاني هو للحد من استخدام الذاكرة ورفع مستوى الأداء بحيث سوف resultset وتحصل من سائق JDBC لا تشمل جميع البيانات. يمكنك تحديد عدد الصفوف عقد من resultset وباستخدام <لأ href = "http://java.sun.com/j2se/1.4.2/docs/api/java/sql/Statement.html#setFetchSize(int)" يختلط = "نوفولو noreferrer"> Statement.setFetchSize () . إذا قمت بنقل المؤشر في resultset وراء عدد الصفوف جلب والسائق JDBC جلب البيانات المفقودة من قاعدة البيانات. (في حالة أوراكل قاعدة البيانات وتخزين البيانات في المؤشر المرجع التي يتم الوصول إليها مباشرة من قبل برنامج تشغيل JDBC).

<اقتباس فقرة>   

* <م> احذر: يتم توفير رمز أدناه كمثال النقي. ما كانت   تم اختبار * وبالتالي قد تضر نفسك أو جهاز الكمبيوتر الخاص بك أو حتى لكمة لك   في وجهه.

إذا كنت ترغب في تجنب تعديل الاستفسارات SQL الخاصة بك ولكن لا تزال تريد أن يكون لها كود نظيفة (وهو ما يعني أن التعليمات البرمجية البقاء للصيانة)، قد تصميم الحل باستخدام مغلفة. وهذا هو، وذلك باستخدام مجموعة صغيرة من الطبقات التفاف القائم منها، قد تحقق ما تريد بسهولة لباقي التطبيق الذي سوف لا تزال تعتقد أنها تعمل مع مصدر البيانات الحقيقي، اتصال وبيان.

1 - تنفيذ StatementWrapper أو فئة PreparedStatementWrapper، وهذا يتوقف ما يستخدم التطبيق الخاص بك بالفعل. هذه الفئات هي مغلفة حول الإعلان أو PreparedStatement العادية الحالات. وهي تنفذ ببساطة باستخدام عبارة الداخلي كمندوب الذي يفعل كل عمل، إلا عندما يكون هذا هو عبارة الاستعلام (طريقة Statement.executeQuery ()). فقط في هذا الوضع الدقيق، المجمع يحيط الاستعلام من قبل اثنين من سلاسل التالية: "SELECT * FROM (" و ") حيث ROWNUM <" + maxRowLimit. لرمز الأساسي المجمع بالرمز، انظر كيف يبدو لDataSourceWrapper أدناه.

2 - كتابة واحدة أكثر المجمع: ConnectionWrapper الذي يلتف اتصال والتي ترجع StatementWrapper في createStatement () وPreparedStatementWrapper في prepareStatement (). تلك هي الطبقات مشفرة سابقا أخذ delegateConnection.createStatement ConnectionWrapper ل() / prepareStatement () كوسائط البناء.

و3 - كرر الخطوة مع DataSourceWrapper. هنا مثال رمز بسيط.

public class DataSourceWrapper implements DataSource
{
    private DataSource mDelegate;

    public DataSourceWrapper( DataSource delegate )
    {
        if( delegate == null ) { throw new NullPointerException( "Delegate cannot be null" );
        mDelegate = delegate;
    }

    public Connection getConnection(String username, String password)
    {
        return new ConnectionWrapper( mDelegate.getConnection( username, password ) );
    }

    public Connection getConnection()
    {
        ... <same as getConnection(String, String)> ...
    }
}

و4 - وأخيرا، استخدام هذا DataSourceWrapper كما مصدر بيانات التطبيق الخاص بك. إذا كنت تستخدم JNDI (NamingContext)، وينبغي أن يكون هذا التغيير تافهة.

والترميز كل هذا هو سريع ومباشر جدا، خصوصا إذا كنت تستخدم IDE الذكية مثل الكسوف أو IntelliJ للوالتي ستنفذ أساليب التفويض التلقائى.

إذا كنت أعلم أنك سوف يكون التعامل مع جدول واحد فقط، ثم تحديد طريقة عرض مع ROWNUM في البيان حيث للحد من عدد من الصفوف. وبهذه الطريقة، يتم التحكم في عدد الصفوف في DB ولا تحتاج إلى أن تكون محددة كجزء من أي استفسار من تطبيق عميل. إذا كنت ترغب في تغيير عدد الصفوف التي تم إرجاعها، ثم إعادة تعريف الرأي قبل تنفيذ الاستعلام.

وهناك طريقة أكثر ديناميكية سيكون لتطوير إجراءات ويمر في عدد من الصفوف، ويكون الإجراء بإرجاع ref_cursor إلى العميل الخاص بك. وهذا من شأنه أن يكون ميزة لتجنب الصعب تحليل على DB، وزيادة الأداء.

وطيب، وتغيير كود أنه سيكون لديك لتكون بعد ذلك.

والسيناريو يحد أداة التقارير مخصصا بحيث يمكن للمستخدم نهاية] لا تنسحب عدد كبير جدا من السجلات وإنشاء تقرير الذي هو غير صالحة للاستعمال.

ونحن بالفعل استخدام وإدارة الموارد على أساس التكلفة أوراكل.

نلقي نظرة على هذا الصفحة مع الوصف الحد كم هو السقوط في جافا التطبيق في كل مرة.كما وظيفة أخرى ، DB سوف لا تزال سحب جميع البيانات ، وهذا هو أكثر للتحكم في الشبكة واستخدام الذاكرة على جافا الجانب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top