Toon posts:

[JSP/MYSQL] Connection.close() has already been called

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een siteje in JSP. Dat werkt perfect op de locale versie (Resin) en op een vorige host (Tomcat).
Nu ben ik overgeschakeld naar een andere host (Resin) en daar krijg ik na een tijdje een fout.

De site gebruikt een stukje om een connectie te openen naar MySQL:

//--- CONNECT ------------------------------------------------------------------------------------------------------
public void connect(String jdbcUrl, String jdbcDriver)
throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException{

Class.forName(jdbcDriver).newInstance();
conn = DriverManager.getConnection(jdbcUrl);
stmt = conn.createStatement();
stmt2 = conn.createStatement();

connected = true;
}

Deze connectie wordt voor de rest van de code steeds gebruikt. Er wordt nergens afgesloten dus.
Dit werkt, maar als je na een tijdje terugkeert naar de site (je moet dus terugkeren!) krijgen we dus de foutmelding in het onderwerp. De site blijft down voor een tijdje (meerdere uren zeker), of tot ik opnieuw de classes laten compileren (dan werkt het opnieuw tot er terug hetzelfde foutloopt).

Al een pak gegoogled, en nu ook op GoT gezocht. Ik vind nergens hetzelfde probleem. Steeds wordt in voorbeelden een connectie geopend en opnieuw gesloten.

Ofwel is er een instelling anders in resin (bij de host waar we nu zijn), die de connecties snel afsluit, waardoor bij opnieuw verbinden er iets misloopt.
Ofwel is er een oplossing in de code.

Wat heb ik geprobeerd?

* Gemaild naar host en gevraagd naar aanpassingen in hun instellingen van Resin, niets dat hiermee te maken zou hebben?
* Bij de stappen waar het misloopt steeds een connectie geopend (dus zelfde lijntje steeds gezet) => Maximum connecties na tijdje, dus fout
* Ook in die stappen steeds close gezet => Opnieuw foutmelding: Connection.close already called.

Tja. Ik weet het dus niet meer... Dankuwel om deze brok al gelezen te hebben, hopelijk nu ook een oplossing?

  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 11:46
de klasse initialiseren voor je SQL driver hoef je maar 1x te doen, zelfde voor het opvragen van het Connection object, je gebruikt die dan doorheen je programma, en je sluit gewoon telkens je statement ...

zo doe ik dit toch

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
Resin sluit niet gesloten connecties vanzelf na xx seconden.
Je kan niet zomaar een db connectie openen en die 3 weken open laten staan. Dan moet je of een connection pool gebruiken of gewoon bij elke request een connectie maken en die aan het eind weer sluiten, wat je bij gebruik van een pool ook moet doen trouwens.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

MySQL sluit wel vanzelf connecties, nadat het te lang idle is, maar dat weet de connection dan nog niet, dus daar moet of op getest worden (Java-equivalent van mysql_ping opzoeken) of je moet gewoon de connectie sluiten als je zeker weet dat ie lange tijd niet gebruikt is en dan weer heropenen.
Maar verder geldt wat Gert zet, imho, wel :)

  • zneek
  • Registratie: Augustus 2001
  • Laatst online: 08-02-2025
als je nou eens aan het begin van elke pagina een connection open doet, en aan het eind een close?

Het niet aanroepen van close betekent volgens mij dat de verbinding nooit gesloten wordt, en krijg je hoe dan ook dat er eens een grens bereikt wordt (max connecties, max mem usage oid)

Zo los ik het meestal op onder ASP. JSP/Java heeft wat elegantere manieren om hier mee om te gaan. Je zou een Sessie object er van kunnen oid. Of je SQL calls via 1 class laten lopen die de connectie opent als ie er nog niet is, en um sluit na gebruik. En werken via een connection pool is ook aan te raden. HEt openen van een db verbinding brengt nogal wat overhead met zich mee. Met een pool krijg je alleen een referentie naar een bestaande connectie waardoor dat vele malen sneller gaat.