Weiter Zurück [Inhalt] Online Suche im Handbuch

34.2 Cursor unter JDBC

SUN´s RMI JDBC Bibliotheken sind sicher die Bibel für Programierer, die man zuerst lesen sollte. Leider unterstützt SUN nur die sogenannten Client Cursor in der forward cursor Variante, was bedeutet, daß das result set mit SELECT .. FROM ...LIMIT 1,20.. seitenweise abgerufen und dargestellt wird. Ein Scrolling zurück ist damit nicht möglich, es wird aber auch wenig benötigt. Es gibt allerdings Hersteller, die Klassenbibliotheken auch hierfür anbieten.

Verwendet man nun die von SUN implementierte JDBC-ODBC Bridge für MySQL, dann können forward cursor dank der DBLibrary von Microsoft ebenfalls verwendet werden. Diese ähneln vom Aufruf her den Serverside Cursorn, auch wenn diese nur von der DBLibrary emuliert werden. MySQL liefert nur die Daten, mehr nicht.

Hier nun ein paar Beispiele, wie man allgemein diese emulierten Cursor unter JAVA anspricht: http://www.rent-a-database.de/mysql/mysqllive.html

Und nun ein paar Ausschnitte des Quellcodes:


Statement stmt = _connection.createStatement();
stmt.setCursorName("author_cursor");
ResultSet rs = stmt.executeQuery("SELECT au_id,
     au_lname, au_fname FROM authors
     WHERE city = 'Oakland'");
while(rs.next())
{
   String id =  rs.getString(1));
.....
.....
Statement stmt1 = _connection.createStatement();
Statement stmt2 = _connection.createStatement();
stmt1.setCursorName("author_cursor");
ResultSet rs = stmt1.executeQuery("SELECT
         au_id,au_lname, au_fname
         FROM authors WHERE city = 'Oakland'
         FOR UPDATE OF au_lname");
String cursor = rs.getCursorName();
String last_name = new String("Smith");
while(rs.next())
{
   if (rs.getString(1).equals("274-80-9391")
    {
      stmt2.executeUpdate("UPDATE authors
            SET au_lname = '"last_name + "'
            WHERE CURRENT OF " + cursor);
...
...
stmt2.executeUpdate("DELETE FROM authors
         WHERE CURRENT OF " + cursor);

Mehrfache Cursor sind unter JAVA ebenfalls möglich. Hier ein Beispiel:


Statement stmt1 = con.createStatement();
stmt1.setCursorName("authCursor");
ResultSet rs1 = stmt1.executeQuery("select * from authors");
while(rs1.next())
{
    // ... do whatever with the results until...
    // if (some condition w/regards to rs1)
    Statement stmt2 = con.createStatement();
    stmt2.setCursorName("titleCursor");
    ResultSet rs2 = stmt2.executeQuery(
"select * from titles for READ ONLY");
    // we want this readonly cursor to be efficient, so...
    Statement stmt3 = con.createStatement();
    stmt3.executeUpdate("set cursor rows 100 for titleCursor");
    while (rs2.next())
    {
       // on the first next() call, the server sends back the
       // first 100 rows of the titles table.  on subsequent
       // rs2.next() calls, we already have the row waiting
       // on the network to be read -- we do not have to do
       // another round-trip to the database to fetch the next
       // row.
....
....

Es ist hierbei völlig egal, welche SQL Datenbank zum Einsatz kommt, da die SQL Datenbanken von der Cursorpositionierung ja nicht betroffen sind (clientsside cursor). Hier sind es die Clients, die an Stelle des SQL - Servers die Aufgaben des Pre-und Postprozessors übernehmen. Die SQL Datenbank liefert auf die Anforderung eines SELECT Statements nur die Daten, alles weitere übernehmen die intelligenten Clients.


Weiter Zurück [Inhalt] Online Suche im Handbuch