Creating Scrollable ResultSets: TYPE_SCROLL_SENSITIVE and Concurrency Modes
Creating Scrollable ResultSets: TYPE_SCROLL_SENSITIVE and Concurrency Modes
Introduction
जब हम JDBC (Java Database Connectivity) के साथ काम करते हैं, तो अक्सर हमें ResultSet को सिर्फ आगे की दिशा (forward direction) में पढ़ने की अनुमति मिलती है। लेकिन कुछ situations में हमें result को ऊपर-नीचे scroll करने या data को update करने की ज़रूरत होती है। ऐसे cases में Scrollable ResultSet बहुत काम आता है।
इस blog में हम detail में समझेंगे कि Scrollable ResultSet क्या होता है, इसके types कौन-कौन से हैं, और खासकर TYPE_SCROLL_SENSITIVE तथा Concurrency Modes कैसे काम करते हैं।
What is ResultSet?
ResultSet JDBC का एक interface है जो database से आने वाले query results को represent करता है। जब हम SQL query execute करते हैं, तो उसका output ResultSet object में store होता है।
By default, ResultSet सिर्फ forward-only होता है, यानी आप data को सिर्फ एक दिशा में (first row से last row तक) पढ़ सकते हैं। लेकिन अगर आपको records के बीच freely move करना है, तो Scrollable ResultSet use किया जाता है।
Types of ResultSet
JDBC में ResultSet को उसकी scrollability और sensitivity के आधार पर तीन major types में divide किया गया है:
- TYPE_FORWARD_ONLY – यह default type है। Cursor सिर्फ forward move कर सकता है।
- TYPE_SCROLL_INSENSITIVE – Cursor दोनों दिशाओं (forward और backward) में move कर सकता है, लेकिन अगर database में data change होता है तो ResultSet उसे reflect नहीं करता।
- TYPE_SCROLL_SENSITIVE – Cursor दोनों दिशाओं में move कर सकता है और database में किए गए changes को reflect करता है।
Example of Creating Scrollable ResultSet
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "pass");
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT * FROM students");
ऊपर दिए गए code में हमने Scrollable और Updatable ResultSet बनाया है जो database changes को detect कर सकता है।
Understanding TYPE_SCROLL_SENSITIVE
TYPE_SCROLL_SENSITIVE ऐसा ResultSet होता है जो database में हुए real-time changes को reflect कर सकता है। यानी अगर database में कोई row update होती है और आप ResultSet को दोबारा read करते हैं, तो आपको updated data दिखाई देगा।
Key Features:
- Cursor forward और backward दोनों directions में move कर सकता है।
- अगर database में data change होता है तो ResultSet उस change को दिखा सकता है।
- Performance थोड़ी धीमी हो सकती है क्योंकि यह data synchronization maintain करता है।
Example Code:
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb","root","1234");
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery("SELECT * FROM employees");
rs.afterLast();
while(rs.previous()){
System.out.println(rs.getInt("id") + " " + rs.getString("name"));
}
ऊपर के example में हमने ResultSet को afterLast() position पर set किया और फिर previous() method से reverse order में records को print किया।
Cursor Movement Methods
Scrollable ResultSet में कुछ important methods होते हैं जो cursor को freely move करने की सुविधा देते हैं।
| Method | Description |
|---|---|
| next() | Cursor को next row पर move करता है। |
| previous() | Cursor को previous row पर move करता है। |
| first() | Cursor को first row पर set करता है। |
| last() | Cursor को last row पर set करता है। |
| absolute(int row) | Cursor को specific row number पर set करता है। |
| beforeFirst() | Cursor को first row से पहले set करता है। |
| afterLast() | Cursor को last row के बाद set करता है। |
Concurrency Modes
Concurrency mode यह बताता है कि ResultSet data को सिर्फ read करेगा या update भी कर सकता है। JDBC में दो types के concurrency modes होते हैं:
- CONCUR_READ_ONLY – Data को सिर्फ read किया जा सकता है, update नहीं।
- CONCUR_UPDATABLE – ResultSet में मौजूद data को update किया जा सकता है और ये changes database में भी reflect होते हैं।
Example of Updatable ResultSet
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","1234");
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT * FROM students");
rs.absolute(2);
rs.updateString("name", "Rahul Kumar");
rs.updateRow();
इस example में हमने दूसरी row को select करके उसका name column update किया है। ये change तुरंत database में reflect हो जाएगा।
Combining ResultSet Type and Concurrency
Scrollable और Concurrency दोनों features को मिलाकर हम powerful ResultSets बना सकते हैं। नीचे table में कुछ common combinations दिए गए हैं:
| Type | Concurrency | Description |
|---|---|---|
| TYPE_FORWARD_ONLY | CONCUR_READ_ONLY | Default mode, सिर्फ forward reading के लिए। |
| TYPE_SCROLL_INSENSITIVE | CONCUR_READ_ONLY | Backward/forward move possible, लेकिन data changes reflect नहीं होते। |
| TYPE_SCROLL_SENSITIVE | CONCUR_UPDATABLE | Bidirectional movement और real-time data reflection दोनों support करता है। |
Practical Use Cases of Scrollable ResultSet
- जब आपको data को random access तरीके से read करना हो (जैसे pagination)।
- जब आपको user interface पर previous-next navigation देना हो।
- जब आपको real-time updates दिखाने हों (TYPE_SCROLL_SENSITIVE)।
- जब आपको ResultSet से ही records update करने हों (CONCUR_UPDATABLE)।
Performance Considerations
Scrollable और Updatable ResultSet powerful होते हैं लेकिन थोड़ा heavy भी। हर बार data synchronization की वजह से performance पर impact पड़ सकता है। इसलिए:
- अगर data static है, तो TYPE_SCROLL_INSENSITIVE बेहतर रहता है।
- अगर data frequently change होता है, तो TYPE_SCROLL_SENSITIVE का use करें।
- Updatable ResultSet का use सिर्फ ज़रूरत के समय करें।
Important Methods for Updating Data
Updatable ResultSet में कुछ useful methods होते हैं जिनसे आप data को modify कर सकते हैं।
| Method | Purpose |
|---|---|
| updateString(columnName, value) | String value update करने के लिए। |
| updateInt(columnName, value) | Integer value update करने के लिए। |
| updateRow() | Changes को database में permanently save करता है। |
| insertRow() | नई row insert करता है। |
| deleteRow() | Current row delete करता है। |
Full Example Program
import java.sql.*;
public class ScrollableExample {
public static void main(String[] args) throws Exception {
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","1234");
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT * FROM students");
rs.last();
System.out.println("Last Student: " + rs.getString("name"));
rs.first();
rs.updateString("name", "Updated Name");
rs.updateRow();
rs.beforeFirst();
while(rs.next()){
System.out.println(rs.getInt("id")+" "+rs.getString("name"));
}
con.close();
}
}
इस program में हमने Scrollable और Updatable ResultSet दोनों को combine करके use किया है, जिससे हम rows को freely move कर सकते हैं और update भी कर सकते हैं।
Key Points to Remember
- Scrollable ResultSet data navigation के लिए helpful होता है।
- TYPE_SCROLL_SENSITIVE real-time changes को detect करता है।
- CONCUR_UPDATABLE mode से आप directly database में changes कर सकते हैं।
- Scrollable ResultSets memory और processing ज्यादा consume करते हैं, इसलिए इन्हें wisely use करें।
Exam-Oriented Notes
- Scrollable ResultSet = Cursor forward और backward दोनों move कर सकता है।
- TYPE_SCROLL_SENSITIVE = Database changes को reflect करता है।
- TYPE_SCROLL_INSENSITIVE = Database changes को reflect नहीं करता।
- CONCUR_READ_ONLY = सिर्फ read operation के लिए।
- CONCUR_UPDATABLE = ResultSet से ही data update करने के लिए।
- Important Methods = next(), previous(), first(), last(), absolute(), beforeFirst(), afterLast()
- Update Methods = updateString(), updateInt(), updateRow(), insertRow(), deleteRow()
- Scrollable ResultSet performance impact कर सकता है — use only when needed।
- Exam में code-based questions अक्सर TYPE_SCROLL_SENSITIVE और CONCUR_UPDATABLE पर आते हैं।