[JDBC]Connection recyclen terwijl RS nog in gebruik is

Pagina: 1
Acties:

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Ik heb een getAll methode die een iterator teruggeeft om alle rijen in een tabel te doorlopen:
Java:
1
2
3
4
5
6
7
8
public Iterator getAll() throws SQLException
{
    Connection connection = m_db.getConnection(); // haalt een Connection uit de pool.
    PreparedStatement stmt = connection.prepareStatement("SELECT * FROM forumlist");
    ResultSet rs = stmt.executeQuery();
    connection.close(); // zet em terug in de pool.
    return new ForumIterator(rs);
}

ForumIterator ziet er zo uit:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
private class ForumIterator implements Iterator
{
    private ResultSet m_rs;
        
    public ForumIterator(ResultSet p_rs)
    {
        m_rs = p_rs;
    }
        
    public boolean hasNext()
    {
        try {
            return ! m_rs.isLast();
        }
        catch (SQLException e) {
            return false;
        }
    }
        
    public Object next()
    {
        try {
            m_rs.next();
            return getForumImpl(m_rs); // maakt een Forum-object van de huidige rij.
        }
        catch (SQLException e) {
            return null;
        }
    }
        
    public void remove()
    {
        throw new UnsupportedOperationException();
    }
}

Zoals je ziet roep ik de close methode van Connection aan voordat ik de Iterator return. Dit is een PooledConnection, zodat ie hierna weer hergebruikt kan worden.

Tot nu toe werkt dit goed, maar dat kan natuurlijk toeval zijn.

Mijn vraag is dus: is het veilig om een Connection opnieuw te gebruiken terwijl de ResultSet die ermee opgehaald is nog in gebruik is?

  • momania
  • Registratie: Mei 2000
  • Laatst online: 21:06

momania

iPhone 30! Bam!

In princiepe hoef je connection helemaal niet te sluiten en ik dacht dat je resultset ook niet afhankelijk is van de connection, maar van het statement.
Zou je het statement object opnieuw gebruiken, dan gaat je resultset verloren. Of je moet een nieuw statement maken met een nieuwe resultset.

Neem je whisky mee, is het te weinig... *zucht*


  • Stephan Oudmaijer
  • Registratie: Oktober 2000
  • Laatst online: 16-08-2023
is geen toeval hoor, de fysieke connectie is niet meer nodig als het ResultSet gevuld is. Kijk maar eens in de ResultSet implementatie van Sun, zijn Object arrays die niets van een Connectie afweten. Je kan dus rustig je connectie sluiten en verder werken met je ResultSet. Doe ik trouwens ook met m`n zelf gebouwde ConnectionPool.

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
momania schreef op 22 December 2002 @ 19:38:
In princiepe hoef je connection helemaal niet te sluiten
Bij PooledConnection's natuurlijk wel :)
CK schreef op 23 december 2002 @ 13:29:
is geen toeval hoor, de fysieke connectie is niet meer nodig als het ResultSet gevuld is. Kijk maar eens in de ResultSet implementatie van Sun, zijn Object arrays die niets van een Connectie afweten. Je kan dus rustig je connectie sluiten en verder werken met je ResultSet. Doe ik trouwens ook met m`n zelf gebouwde ConnectionPool.
Ok, tnx :)

  • Stephan Oudmaijer
  • Registratie: Oktober 2000
  • Laatst online: 16-08-2023
bij pool connection iig niet sluiten maar returnen aan de connection pool, maar das een klein detail :P