Sensitivity Types: Detecting Database Changes in Real Time
Sensitivity Types: Detecting Database Changes in Real Time
Introduction to Sensitivity Types in JDBC
जब हम JDBC (Java Database Connectivity) का use करते हैं, तो ResultSet एक बहुत important object होता है जो database से fetched data को hold करता है। लेकिन जब database में data change होता है, तो ये ज़रूरी नहीं कि ResultSet के अंदर वो change automatically दिखे। इस behavior को control करने के लिए JDBC में Sensitivity Types का concept दिया गया है।
Sensitivity का मतलब होता है — “ResultSet कितनी जल्दी database के changes को detect करता है।” यानी अगर database में कोई record update, delete या insert होता है, तो ResultSet उस change को detect करेगा या नहीं — ये उसकी sensitivity पर depend करता है।
Types of ResultSet Sensitivity
JDBC में तीन प्रकार की Sensitivity दी गई है, जो यह तय करती है कि ResultSet database में हुए changes को detect करेगा या नहीं। ये तीन types हैं:
- TYPE_FORWARD_ONLY
- TYPE_SCROLL_INSENSITIVE
- TYPE_SCROLL_SENSITIVE
1. TYPE_FORWARD_ONLY
यह सबसे simple और fast ResultSet type है। इसमें cursor केवल forward direction में move करता है, और ये database में हुए किसी भी change को detect नहीं करता। यानी जब आपने ResultSet create किया, उस समय जो data था, वही show होगा, चाहे बाद में database update हो जाए।
Key Features:
- Cursor केवल आगे move करता है।
- Data static रहता है, यानी database changes reflect नहीं होते।
- Performance सबसे fast होती है क्योंकि यह lightweight होता है।
Example:
Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery("SELECT * FROM employees");
यहाँ ResultSet सिर्फ sequential reading के लिए use होगा, और अगर किसी row को update या delete किया गया, तो ये detect नहीं करेगा।
2. TYPE_SCROLL_INSENSITIVE
इस type में ResultSet को scroll किया जा सकता है — यानी आप आगे या पीछे move कर सकते हैं। लेकिन यह भी database changes को detect नहीं करता। अगर data update हो गया, तब भी ResultSet पुराना data show करेगा।
Key Features:
- Cursor को forward और backward दोनों directions में move किया जा सकता है।
- Database में किए गए updates ResultSet में reflect नहीं होते।
- Static snapshot of data बनता है, यानी data copy के रूप में memory में store होता है।
- Performance moderate होती है।
Example:
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery("SELECT * FROM students");
इसमें अगर किसी student का record update भी हो जाए, तब भी ResultSet वही पुराना data दिखाएगा।
3. TYPE_SCROLL_SENSITIVE
यह सबसे advanced और dynamic ResultSet type है। इसमें अगर database में कोई record update, insert या delete होता है, तो ResultSet उन changes को detect कर लेता है और data को refresh कर देता है।
Key Features:
- Cursor forward और backward दोनों directions में move कर सकता है।
- Database में हुए changes तुरंत detect हो जाते हैं।
- Dynamic data reflection possible होता है।
- Performance थोड़ी slow हो सकती है क्योंकि यह continuously database से sync होता है।
Example:
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery("SELECT * FROM employees");
अगर किसी employee का salary update हुआ, तो ResultSet में भी वो update automatically reflect होगा।
Difference between TYPE_SCROLL_INSENSITIVE and TYPE_SCROLL_SENSITIVE
| Feature | TYPE_SCROLL_INSENSITIVE | TYPE_SCROLL_SENSITIVE |
|---|---|---|
| Change Detection | Database changes detect नहीं करता | Database changes detect करता है |
| Performance | Fast क्योंकि static copy बनाता है | Slow क्योंकि real-time sync होता है |
| Memory Usage | कम memory use करता है | ज़्यादा memory use करता है |
| Use Case | Reports, static data display | Real-time dashboards या monitoring |
ResultSet Concurrency Modes
Sensitivity types के साथ-साथ JDBC में concurrency modes भी define किए जाते हैं ताकि यह तय किया जा सके कि ResultSet read-only होगा या updatable। ये दो modes हैं:
- CONCUR_READ_ONLY – ResultSet को केवल read करने के लिए use किया जा सकता है।
- CONCUR_UPDATABLE – ResultSet से data update, delete, या insert किया जा सकता है।
Example:
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT * FROM employees");
अब यह ResultSet न केवल real-time changes detect करेगा, बल्कि आप इस ResultSet से records को update भी कर सकते हैं।
Real-Time Change Detection Explained
अब समझते हैं कि “Real-Time Change Detection” असल में कैसे काम करता है। जब आप TYPE_SCROLL_SENSITIVE ResultSet बनाते हैं, तो JDBC driver background में database के साथ communication maintain करता है। जैसे ही database में कोई row update होती है, driver ResultSet को refresh कर देता है।
लेकिन ध्यान देने वाली बात यह है कि हर database driver ये feature support नहीं करता। Example के तौर पर, कुछ databases (जैसे Oracle या MySQL के पुराने drivers) केवल insensitive type को support करते हैं।
Working Mechanism:
- ResultSet initially database से data fetch करता है।
- जब कोई change होता है (update/delete/insert), तो driver ResultSet को re-query करता है।
- ResultSet का cursor data को refresh करके updated records show करता है।
Advantages and Limitations of Sensitivity Types
Advantages:
- आपके program को flexible बनाते हैं – आप decide कर सकते हैं कि changes detect हों या नहीं।
- Performance optimization possible है, क्योंकि आप static या dynamic ResultSet चुन सकते हैं।
- Real-time data monitoring systems बनाने में helpful हैं।
Limitations:
- TYPE_SCROLL_SENSITIVE की performance थोड़ी slow होती है।
- हर database driver सभी types को support नहीं करता।
- Continuous sync के कारण network load बढ़ सकता है।
Use Cases of Each Sensitivity Type
| ResultSet Type | Best Use Case | Example Scenario |
|---|---|---|
| TYPE_FORWARD_ONLY | Sequential data reading | Simple reports या listing pages |
| TYPE_SCROLL_INSENSITIVE | Static result viewing | Student record system जहाँ updates rarely होते हैं |
| TYPE_SCROLL_SENSITIVE | Real-time monitoring | Stock price tracker या live dashboard |
Practical Example with Database Change
चलिए एक छोटा practical example देखते हैं जो दिखाता है कि कैसे TYPE_SCROLL_SENSITIVE ResultSet database changes detect करता है।
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/company", "root", "1234");
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery("SELECT * FROM employees");
// पहले data display करो
while(rs.next()) {
System.out.println(rs.getInt("id") + " " + rs.getString("name"));
}
// अब database में किसी employee का name update करो
// Suppose किसी और program से name change हुआ
// फिर से ResultSet को refresh करो
rs.beforeFirst();
while(rs.next()) {
System.out.println(rs.getInt("id") + " " + rs.getString("name"));
}
अगर driver sensitive ResultSet support करता है, तो output में updated name automatically reflect होगा।
Performance Considerations
अगर आपका application high performance पर depend करता है (जैसे banking या analytics systems), तो TYPE_SCROLL_INSENSITIVE या TYPE_FORWARD_ONLY use करना बेहतर रहेगा। लेकिन अगर आपको real-time monitoring चाहिए, तो TYPE_SCROLL_SENSITIVE सही रहेगा, भले ही वो थोड़ा slow हो।
- Memory Usage: Sensitive type अधिक memory consume करता है।
- Network Load: Frequent synchronization होने से load बढ़ सकता है।
- Performance: Forward-only सबसे तेज़ होता है।
Database Driver Support
हर JDBC driver सभी sensitivity types को support नहीं करता। नीचे कुछ common databases की support list दी गई है:
| Database | TYPE_FORWARD_ONLY | TYPE_SCROLL_INSENSITIVE | TYPE_SCROLL_SENSITIVE |
|---|---|---|---|
| MySQL | Yes | Yes | Partial/No |
| Oracle | Yes | Yes | Partial |
| PostgreSQL | Yes | Yes | Yes |
| SQL Server | Yes | Yes | Yes |
Important Points for Exam
- Sensitivity types JDBC 2.0 से introduced हुए।
- TYPE_FORWARD_ONLY changes detect नहीं करता और सबसे fast होता है।
- TYPE_SCROLL_INSENSITIVE scroll तो करता है पर changes detect नहीं करता।
- TYPE_SCROLL_SENSITIVE real-time changes detect करता है।
- हर database driver sensitive ResultSet support नहीं करता।
- Real-time change detection background re-query mechanism से possible होती है।
Notes (For Quick Revision)
- TYPE_FORWARD_ONLY: Forward movement only, no change detection.
- TYPE_SCROLL_INSENSITIVE: Scrollable, static snapshot.
- TYPE_SCROLL_SENSITIVE: Scrollable, detects database changes in real-time.
- CONCUR_READ_ONLY: Read only ResultSet.
- CONCUR_UPDATABLE: Update allowed ResultSet.
- Use Case: Forward-only → Reports, Insensitive → Display pages, Sensitive → Live systems.