বিবৃতি এবং প্রস্তুতিমূলক স্টেটমেন্টের মধ্যে পার্থক্য


222

প্রস্তুত বিবৃতিটি একটি বিবৃতিটির সামান্য আরও শক্তিশালী সংস্করণ, এবং সর্বদা কমপক্ষে একটি বিবৃতি হিসাবে হ্যান্ডেল করার জন্য কমপক্ষে দ্রুত এবং সহজ হওয়া উচিত।
প্রস্তুত বিবৃতি প্যারামাইট্রাইজ করা যেতে পারে

বেশিরভাগ সম্পর্কিত সম্পর্কিত ডাটাবেসগুলি চারটি ধাপে একটি জেডিবিসি / এসকিউএল কোয়েরি পরিচালনা করে:

  1. আগত এসকিউএল কোয়েরি পার্স করুন
  2. এসকিউএল কোয়েরিটি সঙ্কলন করুন
  3. ডেটা অধিগ্রহণের পথটি পরিকল্পনা করুন / অনুকূলিত করুন
  4. অপ্টিমাইজড ক্যোয়ারী সম্পাদন / ডেটা অর্জন এবং রিটার্ন করুন

ডাটাবেসে প্রেরিত প্রতিটি এসকিউএল কোয়েরির জন্য উপরের চারটি ধাপের মাধ্যমে একটি বিবৃতি সর্বদা অগ্রসর হবে। একটি প্রস্তুত বিবৃতি উপরের সম্পাদন প্রক্রিয়াতে পদক্ষেপগুলি (1) - (3) প্রাক-কার্যকর করে। সুতরাং, একটি প্রস্তুত বিবৃতি তৈরি করার সময় কিছু প্রাক অপ্টিমাইজেশন অবিলম্বে সঞ্চালিত হয়। প্রভাব কার্যকর করার সময় ডাটাবেস ইঞ্জিনের বোঝা কমিয়ে আনা হয়।

এখন আমার প্রশ্নটি হ'ল - "প্রস্তুত বিবৃতি ব্যবহারের অন্য কোনও সুবিধা কি?"


12
আমার মতে সর্বাধিক দক্ষতাটি হ'ল আপনার প্রশ্নটি গতিশীলভাবে প্যারামিটারাইজ করা যেতে পারে
হুসেন আক্তার ওয়াহিদ 'ঘোরি'

উত্তর:


198

একটি এর সুবিধা PreparedStatement:

  • প্রিম্পম্পুলেশন এবং এসকিউএল স্টেটমেন্টের ডিবি-সাইড ক্যাচিং সামগ্রিক দ্রুত কার্যকরকরণ এবং ব্যাচগুলিতে একই এসকিউএল স্টেটমেন্ট পুনরায় ব্যবহার করার ক্ষমতা বাড়ে ।

  • উদ্ধৃতি এবং অন্যান্য বিশেষ অক্ষর অন্তর্নির্মিত এসকিউএল ইঞ্জেকশন আক্রমণগুলির স্বয়ংক্রিয় প্রতিরোধ । নোট করুন যে এর জন্য আপনাকে PreparedStatement setXxx()মানগুলি সেট করতে যে কোনও পদ্ধতি ব্যবহার করা দরকার

    preparedStatement = connection.prepareStatement("INSERT INTO Person (name, email, birthdate, photo) VALUES (?, ?, ?, ?)");
    preparedStatement.setString(1, person.getName());
    preparedStatement.setString(2, person.getEmail());
    preparedStatement.setTimestamp(3, new Timestamp(person.getBirthdate().getTime()));
    preparedStatement.setBinaryStream(4, person.getPhoto());
    preparedStatement.executeUpdate();
    

    এবং এইভাবে স্ট্রিং-কন্টেটিং দ্বারা এসকিউএল স্ট্রিংয়ের মানগুলিকে ইনলাইন করবেন না

    preparedStatement = connection.prepareStatement("INSERT INTO Person (name, email) VALUES ('" + person.getName() + "', '" + person.getEmail() + "'");
    preparedStatement.executeUpdate();
    
  • যেমন একটি এসকিউএল স্ট্রিং অ-মানক জাভা বস্তুর সেটিং হওয়া সত্ত্বেও Date, Time, Timestamp, BigDecimal, InputStream( Blob) এবং Reader( Clob)। এই ধরণের বেশিরভাগ ক্ষেত্রে আপনি toString()যেমন " সরল " করতে পারেন তেমন কোনও সরল উপায়ে আপনি করতে পারেন Statement। এমনকি আপনি PreparedStatement#setObject()নীচের ইউটিলিটি পদ্ধতিতে প্রদর্শিত লুপের ভিতরে ব্যবহার করে এটি সমস্ত রিফ্যাক্টর করতে পারেন :

    public static void setValues(PreparedStatement preparedStatement, Object... values) throws SQLException {
        for (int i = 0; i < values.length; i++) {
            preparedStatement.setObject(i + 1, values[i]);
        }
    }
    

    যা নীচে হিসাবে ব্যবহার করা যেতে পারে:

    preparedStatement = connection.prepareStatement("INSERT INTO Person (name, email, birthdate, photo) VALUES (?, ?, ?, ?)");
    setValues(preparedStatement, person.getName(), person.getEmail(), new Timestamp(person.getBirthdate().getTime()), person.getPhoto());
    preparedStatement.executeUpdate();
    

4
একটি বর্ণনামূলক এবং ব্যাখ্যাযুক্ত পাঠ্য, উল্লেখ এবং উদাহরণ সহ মিলিয়ে একটি দুর্দান্ত উত্তর দেয়। +1
XenoRo

1
@ আরডি এটি সত্য হতে পারে কারণ একটি প্রস্তুত বিবৃতিতে ডাটাবেসে 2 টি রাউন্ড-ট্রিপ দরকার: প্রথম প্রস্তুত করা, দ্বিতীয়টি কার্যকর করা। যাইহোক, আমি এটি পরীক্ষা করতে হবে। আমি অনুমান করি যে পরিকল্পনাটি এখনও একটির জন্য ডাটাবেস সার্ভারে ক্যাশে হবে Statementতবে এটি একটি পরীক্ষার জন্য মূল্যবান হতে পারে।
ব্র্যান্ডন

2
জাভা নিয়ে আমি নিশ্চিতভাবে বলতে পারি না, তবে সাধারণভাবে প্রস্তুত বিবৃতিটি "কোটস এবং অন্যান্য বিশেষ চরিত্রগুলির মধ্যে অন্তর্নির্মিত" প্রবর্তন করে না ; পরিবর্তে, এটি এক্সিকিউটেবল এসকিউএল এবং ডেটা পৃথক করে, এসকিউএলকে কোয়েরি পরিকল্পনায় রূপান্তরিত করার পরে ডিবিএমএমএসকে পৃথক তথ্যের প্যাকেট হিসাবে প্যারামিটারগুলি প্রেরণ করে।
আইএমএসপ

@ বালুসসি - বিস্তারিত ব্যাখ্যার জন্য আপনাকে ধন্যবাদ।
কোডবি ..

49
  1. এগুলি প্রাক-সংকলিত (একবার), গতিশীল এসকিউএল (যেখানে প্যারামিটারগুলি পরিবর্তন হয়) এর পুনরাবৃত্তির জন্য এত দ্রুত

  2. ডেটাবেস বিবৃতি ক্যাচিং ডিবি কার্যকর করার কর্মক্ষমতা বাড়ায়

    পূর্বে সম্পাদিত বিবৃতিগুলির জন্য ডেটাবেসগুলি সম্পাদন পরিকল্পনার ক্যাশে সঞ্চয় করে। এটি ডাটাবেস ইঞ্জিনকে পূর্বে কার্যকর করা বিবৃতিগুলির পরিকল্পনাগুলি পুনরায় ব্যবহার করতে সহায়তা করে to যেহেতু প্রিপেইডস্টেস্টমেন্ট প্যারামিটার ব্যবহার করে, যতবার এটি কার্যকর করা হয় ততবারই এটি একই এসকিউএল হিসাবে উপস্থিত হয়, ডাটাবেসগুলি প্রসেসিং হ্রাস করে পূর্বের অ্যাক্সেস প্ল্যানটিকে পুনরায় ব্যবহার করতে পারে। বিবৃতিগুলি এসকিউএল স্ট্রিংয়ের প্যারামিটারগুলিকে "ইনলাইন" করে এবং তাই ক্যাশের ব্যবহার রোধ করে ডিবি তে একই এসকিউএল হিসাবে উপস্থিত হয় না।

  3. বাইনারি যোগাযোগ প্রোটোকল মানে ডিবি সার্ভারে কম ব্যান্ডউইথ এবং দ্রুত কম কলগুলি

    প্রস্তুত বিবৃতি সাধারণত একটি অ এসকিউএল বাইনারি প্রোটোকলের মাধ্যমে সম্পাদিত হয়। এর অর্থ হ'ল প্যাকেটে কম ডেটা রয়েছে, তাই সার্ভারে যোগাযোগ দ্রুত হয় is থাম্ব নেটওয়ার্ক অপারেশনগুলির নিয়ম হিসাবে ডিস্ক ক্রিয়াকলাপগুলির চেয়ে ধীর গতির একটি ক্রম যা মেমোরি সিপিইউ অপারেশনগুলির চেয়ে ধীর গতিবেগের ক্রম। অতএব, নেটওয়ার্কের মাধ্যমে প্রেরিত ডেটা পরিমাণের যে কোনও হ্রাস সামগ্রিক কর্মক্ষমতাতে ভাল প্রভাব ফেলবে।

  4. তারা প্রদত্ত সমস্ত প্যারামিটার মানগুলির জন্য টেক্সট এড়িয়ে এসকিউএল ইঞ্জেকশন থেকে রক্ষা করে।

  5. তারা ক্যোয়ারী কোড এবং প্যারামিটার মানগুলির (কংকেটেটেড এসকিউএল স্ট্রিংগুলির সাথে তুলনা করে), পাঠযোগ্যতা বৃদ্ধিতে এবং কোড রক্ষণাবেক্ষণকারীদের দ্রুত ক্যোয়ারীর ইনপুট এবং ফলাফলগুলি বুঝতে সহায়তা করে stronger

  6. জাভাতে, ফলাফল সেট ক্ষেত্রগুলি এবং পরামিতি ক্ষেত্রগুলি প্রতিফলিত করতে যথাক্রমে getMetadata () এবং getParameterMetadata () কল করতে পারেন

  7. জাভাতে বুদ্ধিমানভাবে জাভা অবজেক্টসকে সেটঅবজেক্ট, সেটবুলিয়ান, সেটবিট, সেটডেট, সেটডুবল, সেটডুবল, সেটফ্লোট, সেটটেন্ট, সেটলং, সেটশোর্ট, সেটটাইম, সেটটাইমস্ট্যাম্পের মাধ্যমে পরামিতি প্রকার হিসাবে গ্রহণ করে - এটি জেবিবিসি টাইপ ফর্ম্যাটে রূপান্তর করে যা কেবল ডিবিতে উপলব্ধিযোগ্য নয় () ফর্ম্যাট)।

  8. জাভাতে, এসকিউএল আরআরএ গ্রহণ করে সেটআরে পদ্ধতিতে প্যারামিটার প্রকার হিসাবে

  9. জাভাতে, সিএলওবি, বিএলবি, আউটপুট স্ট্রিমস এবং রিডার্সকে "ফিড" হিসাবে সেটক্লাব / সেটএনক্লোব, সেটব্লব, সেটবাইনারিস্ট্রিম, সেটচ্যাকারস্ট্রিম / সেটএসিসিস্ট্রিম / সেটএনক্র্যাকটারস্ট্রিম পদ্ধতিগুলি যথাক্রমে গ্রহণ করে

  10. জাভাতে, ডিবি-নির্দিষ্ট মানগুলিকে এসকিউএল ডেটা LINK, এসকিউএল রাউইড, এসকিউএল এক্সএমএল, এবং সিআরএল, সেটরোউআইডি, সেটএসকিউএলএক্সএক্সএএমএল উত্তর সেট করে নাল পদ্ধতিগুলির মাধ্যমে সেট করার অনুমতি দেয়

  11. জাভাতে, বিবৃতি থেকে সমস্ত পদ্ধতি উত্তরাধিকার সূত্রে প্রাপ্ত হয়। এটি অ্যাডব্যাচ পদ্ধতিটি উত্তরাধিকার সূত্রে প্রাপ্ত এবং অ্যাডব্যাচ পদ্ধতির মাধ্যমে ব্যাচড এসকিউএল কমান্ডের সেটটির সাথে মেলাতে প্যারামিটার মানগুলির একটি সেট যুক্ত করার অনুমতি দেয়।

  12. জাভাতে, একটি বিশেষ ধরণের প্রিপেইডস্টেস্টমেন্ট (সাবক্লাস ক্যালবেলস্টেটমেন্ট) সঞ্চিত প্রক্রিয়াগুলি সম্পাদন করতে দেয় - উচ্চ কার্যকারিতা, এনক্যাপসুলেশন, প্রসেসরিয়াল প্রোগ্রামিং এবং এসকিউএল সমর্থন করে, ডিবি প্রশাসন / রক্ষণাবেক্ষণ / লজিকের টুইঙ্কিং, এবং মালিকানাধীন ডিবি যুক্তি এবং বৈশিষ্ট্যগুলি ব্যবহার


দু'জনই কেবল ইন্টারফেস হলে কীভাবে এই সমস্ত বিস্ময় সম্ভব?
রাফায়েল

1
'বিস্ময়কর'গুলি স্ট্যান্ডার্ড কারখানার পদ্ধতিগুলির মাধ্যমে সম্ভব হয়েছে যা ইন্টারফেসগুলির (বিক্রেতার নির্দিষ্ট) বাস্তবায়ন ফিরিয়ে দেয়: Connection.createStatement এবং Connection.prepareStatement। এই নকশা আপনাকে ইন্টারফেসের বিরুদ্ধে কাজ করতে বাধ্য করে যাতে আপনার নির্দিষ্ট প্রয়োগের ক্লাসগুলি না জানা এবং এই জাতীয় বাস্তবায়ন ক্লাসগুলির সাথে অপ্রয়োজনীয় আঁটসাঁট পোশাক এড়াতে হবে। সমস্ত জাভা jdbc ডক্স এবং জাভা ডক্সের উদাহরণ দিয়ে ব্যাখ্যা করা হয়েছে। :)
গ্লেন সেরা

আপনার "থাম্বের নিয়ম হিসাবে" অংশটি কোনও অর্থহীন নয় around
ভাটিয়া-পেরের

38

PreparedStatementএসকিউএল ইনজেকশন আক্রমণ রোধে খুব ভাল প্রতিরক্ষা (তবে বোকা প্রতিরোধী নয়) । "ছোট্ট ববি টেবিলগুলি" অবাঞ্ছিত পরিদর্শন করা থেকে রক্ষা করার জন্য প্যারামিটার মানগুলি বদ্ধ করার একটি ভাল উপায় ।


6
কিভাবে একটি প্রস্তুত বিবৃতি মাধ্যমে এসকিউএল ইঞ্জেকশন সঞ্চালন করা হবে?
মাইকেল বর্গওয়ার্ট

2
মাইকেল, ভেরিয়েবলগুলি প্রস্তুত বিবৃতিগুলির তর্ক হিসাবে পাস হয়ে যায় স্বয়ংক্রিয়ভাবে জেডিবিসি ড্রাইভার দ্বারা পালিয়ে যাবে।
কোডবি ..

3
কীভাবে একটি এসকিউএল ইঞ্জেকশন আক্রমণ একটি প্রস্তুত বিবৃতিটির বিরুদ্ধে কাজ করবে তার একটি উদাহরণ দিতে পারেন? আপনি কি ডাটাবেস কোডটিতে একটি বাগ ধরে নিচ্ছেন?
পিটার পুনরুদ্ধার করুন

2
হ্যাঁ, তবে এটি "বেশ বোবা" এর বাইরেও। এটা বোকামি বয়ে যেতে মন। জ্ঞান আউন্স সহ কেউ তা করতে পারে না।
duffymo

2
এছাড়াও, অনেক ডেটাবেস বিক্রেতারা ORDER BYনির্দিষ্ট স্থানে (মনে করে ) এবং / অথবা সংখ্যার ধ্রুবকগুলিকে প্যারামিটারাইজিং সমর্থন করে না (মনে হয় LIMIT, OFFSETএবং অন্যান্য পৃষ্ঠাগুলি সমাধান), সুতরাং এসকিউএল ইনজেকশন দ্বারা আক্রমণ করা যেতে পারে, এমনকি যখন প্রস্তুত বিবৃতি এবং প্যারামিটারাইজেশন যেখানেই ব্যবহৃত হয় সম্ভব.
DNET

31

বিবৃতি ওপরে প্রস্তুতিমূলক স্টেটমেন্টের কিছু সুবিধা হ'ল:

  1. প্রিপার স্টেস্টমেন্ট এসকিউএল ইনজেকশন আক্রমণগুলিকে আটকাতে আমাদের সহায়তা করে কারণ এটি স্বয়ংক্রিয়ভাবে বিশেষ অক্ষরগুলি ছাড়িয়ে যায়।
  2. রেডিয়ার স্টেটমেন্ট আমাদের প্যারামিটার ইনপুটগুলি দিয়ে ডায়নামিক ক্যোয়ারীগুলি কার্যকর করতে অনুমতি দেয়।
  3. প্রিপার স্টেস্টমেন্ট কোয়েরির জন্য ইনপুট পরামিতিগুলি সেট করতে বিভিন্ন ধরণের সেটার পদ্ধতি সরবরাহ করে।
  4. প্রস্তুতিমূলক স্টেটমেন্ট বিবৃতি চেয়ে দ্রুত। যখন আমরা প্রস্তুতিমূলক স্টেটমেন্টটি পুনরায় ব্যবহার করি বা একাধিক কোয়েরি চালানোর জন্য এটির ব্যাচ প্রসেসিং পদ্ধতি ব্যবহার করি তখন এটি আরও দৃশ্যমান হয়।
  5. প্রস্তুতিমূলক স্টেটমেন্ট আমাদের সেটার পদ্ধতির সাথে অবজেক্ট ওরিয়েন্টড কোড লেখার ক্ষেত্রে সহায়তা করে যেখানে স্টেটমেন্টের সাথে কোয়েরি তৈরি করতে আমাদের স্ট্রিং কনটেনটেশন ব্যবহার করতে হবে। যদি সেট করার জন্য একাধিক প্যারামিটার থাকে তবে স্ট্রিং কনটেনটেশন ব্যবহার করে ক্যোয়ারী লেখা খুব খারাপ এবং ত্রুটির প্রবণ দেখায়।

এসকিউএল ইনজেকশন সমস্যা সম্পর্কে আরও পড়ুন http://www.jorterdev.com/2489/jdbc-statement-vs-preparedstatement-sql-inication- উদাহরণ


আমি আপনার নিবন্ধটি পড়েছি, সত্যিই ভাল। আমার প্রশ্ন এখন কেন কেউ বিবৃতি ব্যবহার করবে ?! এমনকি একটি স্থির প্রশ্নের জন্য ?!
পেডরাম বাশিরি

আমি সর্বদা প্রস্তুতিমূলক স্টেটমেন্ট ব্যবহার করি, আমি এমন কোনও নির্দিষ্ট দৃশ্য জানি না যেখানে বিবৃতিতে আরও সুবিধা হতে পারে।
পঙ্কজ

13

বেশি কিছু যোগ করার নেই,

1 - আপনি যদি কোনও লুপে (1 বারের বেশি) কোনও জিজ্ঞাসা চালাতে চান তবে প্রস্তুত বিবৃতিটি দ্রুততর হতে পারে, কারণ আপনি যে অপটিমাইজেশনের উল্লেখ করেছেন of

2 - প্যারামিটারাইজড ক্যোয়ারী এসকিউএল ইঞ্জেকশন এড়ানোর একটি ভাল উপায়। প্যারামিটারাইজড ক্যোয়ারী কেবল প্রস্তুত স্টেটমেন্টে উপলব্ধ।


10

বিবৃতি স্থির এবং প্রস্তুত স্টেটমেন্টটি গতিশীল।

বিবৃতি ডিডিএলের জন্য উপযুক্ত এবং ডিএমএলের জন্য প্রস্তুত স্ট্যাটমেন্ট।

বিবৃতি ধীরে ধীরে তৈরি করা বিবৃতিটি দ্রুততর হয়।

আরও পার্থক্য (সংরক্ষণাগারভুক্ত)


7

বিবৃতিতে সিএলওবি করতে পারে না।

এবং: (ওরাকলপ্রেড স্টেটমেন্ট) পিএস


7

ম্যাটজেমস দ্বারা উদ্ধৃত হিসাবে

জেডিবিসি-তে একটি বিবৃতি ব্যবহারের জন্য ডিডিএল (অ্যালটার, ক্রিয়েট, গ্রান্ট ইত্যাদি) ব্যবহারের জন্য এটি 100% স্থানীয় করা উচিত কারণ এগুলি কেবলমাত্র বিবৃতি প্রকার যা BIND VARIABLES গ্রহণ করতে পারে না। প্রিপার স্টেটমেন্টস বা কলএল স্টেটমেন্টগুলি অন্য যে কোনও ধরণের বিবৃতি (ডিএমএল, ক্যোয়ারী) এর জন্য ব্যবহার করা উচিত। যেহেতু এটি স্টেটমেন্টের ধরণ যা বাইন্ড ভেরিয়েবল গ্রহণ করে।

এটি সত্য, একটি নিয়ম, একটি আইন - প্রস্তুত বিবৃতি সর্বদা ব্যবহার করুন। STATEMENTS ব্যবহার করুন যেখানে প্রায় নেই।


5

বেকার ইনজেকশন প্রস্তুত বিবৃতি দ্বারা উপেক্ষা করা হয় তাই প্রস্তুত বিবৃতিতে সুরক্ষা বৃদ্ধি করা হয়


4
  • এটি পড়া সহজ
  • আপনি সহজেই ক্যোয়ারী স্ট্রিংটিকে একটি ধ্রুবক করতে পারেন

4

স্ট্যাটিক এসকিউএল স্টেটমেন্টগুলি সম্পাদন করার জন্য বিবৃতি ব্যবহৃত হবে এবং এটি ইনপুট পরামিতিগুলি গ্রহণ করতে পারে না।

প্রিপার স্টেটমেন্ট বহুবার গতিশীল এসকিউএল স্টেটমেন্ট কার্যকর করার জন্য ব্যবহৃত হবে। এটি ইনপুট পরামিতি গ্রহণ করবে।


4

প্রস্তুত বা প্যারামিটারাইজড ক্যোয়ারির আরেকটি বৈশিষ্ট্য: এই নিবন্ধটি থেকে নেওয়া রেফারেন্স।

এই বিবৃতি ডাটাবেস সিস্টেমের অন্যতম বৈশিষ্ট্য যাতে একই এসকিউএল বিবৃতি উচ্চ দক্ষতার সাথে বারবার কার্যকর করে। প্রস্তুত বিবৃতিগুলি এক ধরণের টেম্পলেট এবং বিভিন্ন পরামিতি সহ অ্যাপ্লিকেশন দ্বারা ব্যবহৃত হয়।

বিবৃতি টেম্পলেটটি প্রস্তুত করে ডেটাবেস সিস্টেম এবং ডেটাবেস সিস্টেমে প্রেরণ করা হয়, এই টেম্পলেটটিতে পার্সিং, সংকলন এবং অপ্টিমাইজেশন সম্পাদন করে এবং এটি সম্পাদন না করে সঞ্চয় করে।

কিছু প্যারামিটারের মতো, যেখানে টেমপ্লেট তৈরির পরে অ্যাপ্লিকেশন চলাকালীন ক্লজটি পাস করা হয় না, এসকিউএল স্টেটমেন্টের ডেটাবেস সিস্টেম এবং ডাটাবেস সিস্টেমের ব্যবহারের টেমপ্লেটে এই পরামিতিগুলি প্রেরণ করে এবং অনুরোধ অনুযায়ী কার্যকর করে।

এসকিউএল ইঞ্জেকশনের বিরুদ্ধে প্রস্তুত বিবৃতিগুলি খুব কার্যকর কারণ অ্যাপ্লিকেশনটি বিভিন্ন কৌশল এবং প্রোটোকল ব্যবহার করে প্যারামিটার প্রস্তুত করতে পারে।

যখন ডেটার সংখ্যা বাড়ছে এবং সূচীগুলি ঘন ঘন পরিবর্তিত হয় তখন প্রস্তুতিমূলক বিবৃতি ব্যর্থ হতে পারে কারণ এই পরিস্থিতিতে একটি নতুন ক্যোয়ারী পরিকল্পনা প্রয়োজন।


3

Statement ইন্টারফেস পরামিতি ছাড়াই স্থির এসকিউএল স্টেটমেন্ট কার্যকর করে

PreparedStatement ইন্টারফেস (বিবৃতি প্রসারিত) পরামিতিগুলি ছাড়াই / ছাড়াই একটি পূর্বনির্দিষ্ট এসকিউএল বিবৃতি কার্যকর করে

  1. বারবার মৃত্যুদণ্ড কার্যকর করার জন্য দক্ষ

  2. এটি পূর্বগঠিত তাই এটি দ্রুত


2

বিভ্রান্তি পেতে না: সহজভাবে মনে রাখবেন

  1. স্টেটমেন্টটি ডিডিএল যেমন স্ট্র্যাটিক ক্যোয়ারির জন্য যেমন তৈরি, ড্রপ, পরিবর্তন এবং রেডিস্টেটমেন্ট ব্যবহার করা হয় ডায়নামিক ক্যোয়ারি অর্থাৎ ডিএমএল ক্যোয়ারির জন্য।
  2. বিবৃতিতে, ক্যারিয়ারটি স্টিপমেন্টের ক্যোয়ারিতে প্রাক-কম্পাইল করা হয় না, কারণ এই প্রস্তুতিটি সময় দক্ষ হয়।
  3. স্টেটমেন্টটি আর্গুমেন্ট গ্রহণ না করার সময় তৈরির সময় যুক্তি নেয় prepare উদাহরণস্বরূপ আপনি যদি টেবিল তৈরি করতে চান এবং উপাদানটি সন্নিবেশ করতে চান তবে :: স্টেটমেন্টটি ব্যবহার করে টেবিল (স্ট্যাটিক) তৈরি করুন এবং এলিমেন্ট (ডাইনামিক) তৈরি করুন স্টেটমেন্ট ব্যবহার করে।

1
স্টেটমেন্টটি আর্গুমেন্ট গ্রহণ না করার সময় তৈরির সময় যুক্তি নেয় argument

1

& চারপাশের শব্দার্থবিজ্ঞানের দুর্বল বোঝার কারণে আমি অনেক ধীর কোড Statementব্যবহার করে একটি সমাধানে - (তবে এসকিউএল ইনজেকশন থাকা) ব্যবহার করে একটি ওয়ার্কিং লেগ্যাসি কোড পরিবর্তন করতে এই প্রশ্নের সমস্ত উত্তর অনুসরণ করেছি ।PreparedStatementStatement.addBatch(String sql)PreparedStatement.addBatch()

তাই আমি এখানে আমার দৃশ্যের তালিকা দিচ্ছি যাতে অন্যরা যাতে ভুল না করে।

আমার অবস্থা ছিল

Statement statement = connection.createStatement();

for (Object object : objectList) {
    //Create a query which would be different for each object 
    // Add this query to statement for batch using - statement.addBatch(query);
}
statement.executeBatch();

সুতরাং উপরের কোডে, আমার হাজার হাজার বিভিন্ন প্রশ্ন ছিল, সমস্ত একই বিবৃতিতে যুক্ত হয়েছিল এবং এই কোডটি দ্রুত কাজ করেছিল কারণ বিবৃতি ক্যাশে করা হয়নি ভাল ছিল এবং এই কোডটি অ্যাপ্লিকেশনটিতে খুব কমই কার্যকর করা হয়েছিল।

এসকিউএল ইনজেকশনগুলি ঠিক করার জন্য, আমি এই কোডটি পরিবর্তিত করেছি,

List<PreparedStatement> pStatements = new ArrayList<>();    
for (Object object : objectList) {
    //Create a query which would be different for each object 
    PreparedStatement pStatement =connection.prepareStatement(query);
    // This query can't be added to batch because its a different query so I used list. 
    //Set parameter to pStatement using object 
    pStatements.add(pStatement);
}// Object loop
// In place of statement.executeBatch(); , I had to loop around the list & execute each update separately          
for (PreparedStatement ps : pStatements) {
    ps.executeUpdate();
}

সুতরাং আপনি দেখুন, আমি কয়েক হাজার PreparedStatementঅবজেক্ট তৈরি করা শুরু করেছি এবং শেষ পর্যন্ত ব্যাচিংকে কাজে লাগাতে পারছি না কারণ আমার দৃশ্যের দাবি there এখানে হাজার হাজার আপডেট বা ইনসার্ট অনুসন্ধান রয়েছে এবং এই সমস্ত কোয়েরি আলাদা happen

পারফরম্যান্স অবক্ষয়ের কোনও মূল্য ছাড়াই এসকিউএল ইঞ্জেকশন স্থির করা বাধ্যতামূলক ছিল এবং আমি মনে করি না যে PreparedStatementএই পরিস্থিতিতে এটি সম্ভব হয়েছে।

এছাড়াও, আপনি যখন ইনবিল্ট ব্যাচিং সুবিধা ব্যবহার করেন, কেবলমাত্র একটি বিবৃতি বন্ধ করার বিষয়ে আপনাকে চিন্তা করতে হবে তবে এই তালিকা পদ্ধতির সাথে আপনাকে পুনরায় ব্যবহারের আগে বিবৃতি বন্ধ করতে হবে, একটি প্রস্তুতিমূলক স্ট্যাটমেন্ট পুনরায় ব্যবহার করা উচিত

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.