Database Connection Class and Interface

Database Connection Class and Interface: हालांकि हम कई प्रकार के Data Sources को ADO.NET के माध्‍यम से Frontend से Connect कर सकते हैं, लेकिन फिर भी विभिन्न प्रकार के Data Sources कुछ काम हमेंशा Common रूप से करते हैं।

उदाहरण के लिए हर Data Source पर Connection को Open व Close किया जाता है, हर Data Source के Connection की किसी Particular समय पर एक निि”चत स्थिति होती है, जो Data Source की Open, Close जैसी Current State को Represent करता है। सभी प्रकार के Data Sources पर Apply होने वाले इन Common Behaviors को ADO.NET द्वारा IDbConnection Interface को Implement करके Enforce किया जाता है।

ADO.NET Connection Object को हम एक ऐसा Object मान सकते हैं, जो किसी External Resource के साथ प्रक्रिया करता है। Connection Object किसी External Resource के साथ क्या काम करता है, केवल यही बात महत्वपूर्ण नहीं होती है बल्कि जिस Resource के साथ ये Object काम करता है, उस Resource व Frontend के बीच आने&जाने वाला Data Performance को प्रभावित करते हुए Transfer होता है।

क्योंकि किसी Backend के साथ Connection स्थापित करना किसी भी Frontend के लिए सबसे ज्यादा Performance Intensive Task होता है। इसी वजह से ये जरूरी होता है कि Connection Object IDisposable Interface को Implement करे।

IDisposable Interface, .NET का एक Standard Interface है, जिसमें Dispose() नाम का एक Method होता है, जिसे Connection Object में Define करना होता है। ये Method Connection Object को Allocate किए गए Resources को Release करने का काम करता है।

चूंकि Connection Object में IDbConnection Interface को Implement किया गया होता है, जिसमें IDisposable Interface को Implement किया गया है, इसलिए भी Connection Object में Dispose() Method को Define करना जरूरी होता है। .NET Data Provider को IDbConnection Interface में Declare किए गए निम्न Methods को Implement करना होता है:

BeginTransaction() Method

Data Consistency बना, रखने के लिए ज्यादातर Modern Databases Transactions के Concept को Support करते हैं, जिसके अन्तर्गत या तो कामों के समूह के सभी काम पूरे होते हैं अथवा कोई भी काम पूरा नहीं होता। यानी Transaction एक All or Nothing Fashion में काम करने वाला Atomic Operation को Define करता है, जिसमें Specify किए गए या तो सभी Operations Perform होते हैं या फिर कोई भी Operation Perform नहीं होता।

BeginTransaction() एक Common रूप से Use किया जाने वाला ऐसा Function है, जो किसी Database पर किसी Transaction को Begin करने के लिए Call किया जाता है। ये Method एक Overloaded Method है और इन Overloaded Methods में से एक Method हमें Current Transaction को IsolationLevel में Specify करने की सुविधा Provide करता है। ये Transaction, System.Transaction Namespace में Implemented Transaction से अलग होता है।

ChangeDatabase() Method

जब हमारा Frontend किसी Database Server से Connect करता है, तो एक ही Server पर एक से ज्यादा Running Databases हो सकते हैं। इस स्थिति में ChangeDatabase() Function हमें समान Server पर स्थित विभिन्न Databases पर Change करने की सुविधा देता है।

ChangeDatabase() को Call करना एक बिल्कुल नया Connection Establish करने की तुलना में काफी ज्यादा Performing होता है। यहां तक कि Connection Pooling भी इतना Performing नहीं होता। लेकिन ये सुविधा केवल SQL Server Databases तक ही सीमित है, क्योंकि SQL Server एक 2-Step Connection Process को Follow करता है, जहां पहले Step में SQL Server, Database से Connect होता है, जबकि दूसरे Step में Catalog की Request करता है। इसलिए ChangeDatabase() Function को Call करके हम केवल Catalog को ही Change करते हैं, नया Connection Establish नहीं करते।

Open() Method

ये Method किसी Database पर Connection को Open करता है और उस Open किए गए Connection को Use करने ला;क बनाता है, ताकि Frontend Application Database के Data को Access व Manipulate कर सके। Open किया गया Database Connection तब तक Pooled नहीं होता, जब तक कि उसे Explicitly यानी Manually Close या Dispose नहीं कर दिया जाता। इसलिए ये जरूरी होता है कि Connection को जितना सम्भव हो उतना देर से Open किया जाए और जितना जल्दी हो सके, उतना जल्दी Close कर दिया जाए।

एक Developer के रूप में हमारे लिए समझने वाली बात ये है कि हालांकि Close() व Dispose() दोनों ही Methods का प्रयोग Connection Pooling में मदद करते हैं, लेकिन Close() Method का प्रयोग करके Close किए गए Connection को फिर से Open किया जा सकता है जबकि Dispose() Method का प्रयोग करके Dispose किए गए Connection को फिर से Open नहीं किया जा सकता।

CreateCommand() Method

Database के साथ जो Interaction किया जाता है वह Interaction, Command Object के माध्‍यम से पूरा होता है। Command Object हमें विभिन्न प्रकार के Parameters के साथ Command Text Specify करने की सुविधा देता है। जहां Command को Execute करने के लिए इसे इस बात की जानकारी होना जरूरी होता है कि Command को किस Database के Against Execute करना है। जब किसी Connection Object के लिए CreateCommand() Method Execute होता है, तो एक Command Object Create होता है, जो कि उसी Connection के लिए Execute होता है जिसके लिए उसे Create किया गया है।

IDbConnection Interface के उपरोक्त Methods के अलावा निम्न Properties को भी Implement करने की जरूरत पडती है:

ConnectionString Property

इस Property में हमें उस Data Source से सम्बंधित विभिन्न जरूरी Parameters को Specify करना होता है, जिनकी आव”;कता उस Data Source से Connection स्थापित करने के लिए जरूरी होती है। हम जरूरत के अनुसार किसी Particular Data Source के आधार पर इस Property में अन्य Database Specific Parameters भी Specify कर सकते हैं।

ConnectionTimeout Property

चूंकि Connection हमेंशा किसी न किसी Physical File के साथ ही स्थापित किया जाता है, फिर भले ही वह कोई Text File हो अथवा Database File हो। इस स्थिति में कई बार किसी कारणवश कोई Specific File Open नहीं हो पाती।

इस स्थिति में इस Property द्वारा हम इस बात को Specify करते हैं कि हमारा Connection Object अधिकतम कितने Seconds के समय तक Connection Establish करने की कोशिश करने के बाद Connection Fail होने की प्रक्रिया को Follow करेगा। जबकि इस Property में Specify किया गया मान 0 Limitless Timeout को Represent करता है।

Database Property

इस Property में हमें Current Database या उस Database का नाम Specify करना होता है, जिसे Connection Open होने के बाद Use करना है।

State Property

ये Property किसी Connection Object को उसकी Current State Specify करने की सुविधा देता है। इस Property की सबसे ज्यादा Most Common तरीके से Use की जाने वाली State ConnectionState.Open ConnectionState.Closed है।

DbConnection Class

ये एक Abstract Class है, जिसे Compulsory रूप से Inherit करना जरूरी होता है, क्योंकि हम इस Class के Direct Object Create नहीं कर सकते। हर Specific Data Provider की Connection Class को इस Class को Inherit करना Compulsory होता है। DbConnection Class, IDbConnection को Implement करता है। इसलिए हमें इसे अलग से Implement करने की जरूरत नहीं होती है।

अत: हम हमारे Development के समय जो भी Data Source Use करें, सभी Commonality Concept को Follow करते हुए समान Methods व Properties Provide करते हुए Database Access व Manipulate करने की सुविधा देते हैं।

चूंकि .NET Data Provider का Connection Object हमेंशा DbConnection Class को Inherit करता है, इसलिए इस Class के सभी Logics पहले से Implemented होते हैं, जिन्हें हम Directly Use कर सकते हैं।

उदाहरण के लिए यदि हम SqlConnection Class को Use करते है, तो इस Class में DbConnection को पहले से ही Derive करने की वजह से IDbConnection Interface के सभी Methods व Properties को Implement किया जा चुका है। इसीलिए बिना किसी Extra Coding के हम SqlConnection.Open(), SqlConnection.Dispose(), SqlConnection.Close() आदि Methods को Directly Use कर सकते हैं।

Connection Pooling

जब हम ADO.NET का प्रयोग करते हुए ऐसे High Demand Applications Create करते हैं, जिनका प्रयोग करते हुए एक ही समय पर बहुत सारे Users Concurrently समान Database को Access व Manipulate कर रहे होते हैं, तब सभी Users के लिए Database Connection को तब तक Open रखना जब तक कि हर User उस Database को Use कर रहा है, Database के Performance पर काफी Negative Impact डालता है, जो कि ठीक नहीं कहा जा सकता।

उदाहरण के लिए Stock Market में हर Second हजारों Transactions Perform होती हैं और एक ही समय पर हजारों Users समान Database पर Market की Live Status को देखने के लिए Request Perform करते हैं। ऐसे में सभी Users के लिए समान समय पर समान Database पर हजारों Connections को Open रखना और तब तक Open रखना जब तक कि सभी Users उस समान Live Data को Access कर रहे हैं, Database की Performance को बहुत ही ज्यादा प्रभावित करता है। परिणामस्वरूप Database के Crash होने की सम्भावना काफी ज्यादा हो जाती है।

पिछले Section में हमने इस विष; में थोडा बहुत Discuss किया था कि IDbConnection, IDisposable को Implement करता है। जबकि ये जरूरी होता है कि Connection Class हमेंशा IDisposable Interface के Dispose() Method को Implement करे] जो कि सभी प्रकार के Allocated Resources को Cleanup करने का काम करता है।

जब हम ADO.NET का प्रयोग करते हुए Stock Market जैसा कोई High Demanding Complex Application Create करते हैं, तब हमें SQL Server या Oracle जैसे बहुत ही Powerful Database Server की जरूरत होती है, जो कि समानान्तर रूप से हजारों Connections को समान समय पर Handle करने में सक्षम होते हैं।

SqlConnection या OracleConnection जैसे Data Provider Specific Connection Objects द्वारा ADO.NET सामान्यत: Network के माध्‍यम से Database Server से Communication करता है। जबकि हम जानते हैं कि Network की Speed अभी भी काफी कम होती है। इस स्थिति में समान समय पर एक ही Database Server पर हजारों Connections को तब तक के लिए Open रखना जब तक कि User किसी Database Server से Interaction करता है, सम्भव नहीं हो सकता।

इसलिए इस समस्या के समाधान के रूप में अलग-अलग Data Source अलग-अलग तरह के Database Server Architectures Use करते हैं। जिनमें से कुछ Database Servers पहले से Ready to Use, Open Physical Network Connections Use करते हैं और जो Connection Currently Use में नहीं होता, उसे किसी Particular Database Request को Perform करने के लिए Use कर लेते हैं।

ये Architecture सामान्यत: SQL Server का SqlConnection Object Use करता है। इस Architecture को उपयोग में लेने के कारण SQL Server Database पर कम Physical Connections द्वारा अधिक Request को DbConnection Object के माध्‍यम से पूरा किया जाना सम्भव हो पाता है।

इस Architecture के अन्तर्गत DbConnection Object, Connection Pooling नाम के एक Mechanism को उपयोग में लेता है और पहले से Perform किए गए Database Request के Data को ही बिना अधिक Resources का उपयोग किए हुए अन्य Database Requests को पूरा करने के लिए Reuse कर लेता है।

यानी समान समय पर जब समान Data के लिए बहुत सारे Users Request करते हैं, तो केवल पहली Request को ही Physically Database पर Perform किया जाता है और Database द्वारा Return होने वाले Data को थोडी देर के लिए Cache कर लिया जाता है। फिर उसी समान Database Request को जब अन्य Users द्वारा Perform किया जाता है, तो अगली बार आने वाली समान Request को फिर से Database पर Perform नहीं किया जाता, बल्कि Cache में Stored Data को ही Database Request के Response के रूप में Return कर दिया जाता है।

परिणामस्वरूप Database पर कम Connections Open करने पडते हैं और कम Connections से Returned Result को ज्यादा Users को Serve कर दिया जाता है। जिसकी वजह से High Demand Application की Performance काफी Improve हो जाती है और Database के Crash होने की सम्भावना नहीं रहती, क्योंकि Database पर समानान्तर रूप से बहुत कम Connections Open किए जाते।

यहां ये बात ध्‍यान रखने वाली है कि SqlConnection या OracleConnection Object Instances समान तरीके से Physical Database Connections Open नहीं करते। बल्कि Database पर Physically Open किए जाने वाले Connections की सं[या को Connection Pooling Architecture का प्रयोग करते हुए Internally ADO.NET द्वारा Mange किया जाता है। जबकि Frontend में SqlConnection या OracleConnection नाम के Specific DbConnection Object के माध्‍यम से Actual Physical Connection Data का Access व Manipulation Perform होता है।

हम ये मान सकते हैं कि एक High Demand Application में बहुत सारे Connections समानान्तर रूप से Open रहते हैं और तब तक Open रहते हैं, जब तक कि User की Requirement पूरी नहीं हो जाती। जबकि ये Opened Connection पूरे समय Active यानी उपयोगी नहीं रहते क्योंकि User पूरे समय समान Active Connection को Use नहीं कर रहा होता बल्कि Frontend Application के अन्य हिस्सों के साथ भी जरूरत के अनुसार Interact कर रहा होता है।

इस स्थिति में वास्तव में User को उसके Opened Connection की पूरे समय जरूरत नहीं होती बल्कि समय के कुछ हिस्से में ही उसे Opened Connection की जरूरत होती है। इसलिए समान Opened Connection के Expensive Resources को Multiple Users के बीच Pool किया जा सकता है, जिसके अन्तर्गत समान Opened Connection को अलग-अलग Users अलग-अलग समय पर उपयोग में लेते हैं। इस प्रक्रिया को Connection Pooling के नाम से जाना जाता है क्योंकि समान Connection कई Users द्वारा जरूरत के अनुसार Pool (Share) किया जाता है।

ADO.NET के साथ Connection Pooling को Use करना काफी आसान होता है, क्योंकि Connection Pooling करने के लिए हमें एक Developer के रूप में] यदि हम इसे Use करना न चाहें] तो इसे Manually Off करने के अलावा अन्य किसी Default Setting के साथ कुछ भी Extra करने की जरूरत नहीं होती है।

उदाहरण के लिए SqlClient के लिए यदि हम हमारे Connection को Pool करना नहीं चाहते, तो हमें हमारे Connection String में निम्नानुसार एक Key-Value Pair को Specify करने के अलावा और कुछ नहीं करना होता%

        Pooling=false;

जैसाकि हमने इसी Chapter में पिछले Sections में देखा है कि किसी Backend Database के साथ ADO.NET के माध्‍यम से Frontend का Connection Establish करने के लिए हमें Connection String Specify करना होता है, जिसमें हमें Database Related Parameters को Specify करना होता है। इसलिए जब हम Connection String का प्रयोग करते हुए किसी Database पर Connection Establish करते हैं, तो ADO.NET स्वयं ही Internally हमारे द्वारा Specified हर Opened Connection के लिए एक Pool Maintain करता है।

अन्य शब्दों में कहें तो ADO.NET Connection String को एक Key की तरह प्रयोग करते हुए Pools के एक Collection को Maintain करता है। जब हम किसी Connection Object पर Open() Method का प्रयोग करते हुए कोई Connection Open करने की Request Perform करते हैं, तो ADO.NET Internally सबसे पहले ये Check करता है कि क्या उसमें कोई Unused Physical Database Connection Available है या नहीं।

Physical Database Connection उस स्थिति में Pooled होने के लिए Ready होता है, जबकि कोई अन्य User या Frontend Application का कोई Part Actively उस Connection को Use नहीं कर रहा होता है। यानी Effective Connection Pooling के लिए जरूरी है कि Connection को जितना सम्भव हो उतना देर से Open होना चाहिए, जबकि जितना जल्दी हो, उतना जल्दी Close हो जाना चाहिए।

यदि Database Server पर समान समय पर बहुत सारे Requests Perform हों] तो ADO.NET स्वयं ही अपने स्तर पर Application के Load के आधार पर इस बात का निर्ण; लेता है कि उसे कब एक से ज्यादा Physical Connection को Concurrently Open करना है। जबकि Database Server पर Request की सं[या कम होने पर ADO.NET स्वयं ही Opened Physical Connections को Close भी करता रहता है।

इन Connection Pooling Parameters की एक Default सं[या भी होती है, जिसे हम हमारी जरूरत के अनुसार Connection String द्वारा Configure कर सकते हैं। जबकि Connection String में Extra Parameters के रूप में हम SqlClient Connection Pooling Key-Value Pairs को अपनी जरूरत के अनुसार उस Specific Situation में उपयोग में ले सकते हैं।

ADO.NET with C# in Hindi - BccFalna.com: TechTalks in Hindi ये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook ADO.NET with C# in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी। 

ADO.NET with C# in Hindi | Page:501 | Format: PDF

BUY NOW GET DEMO REVIEWS