Tomcat 5.5 en HSQL in-process mode leveren bij mij wat problemen op.
Het probleem met onderstaande code is dat deze bij veel requests (ik simuleer dat even door Ctrl-R ingedrukt te houden) een "Access is denied: Session is closed" melding geeft. Google was niet erg behulpzaam, en ik denk dat ik eigenlijk ook wel weet wat het betekend. De database connectie lijkt tussen de getConnection() binnen doPost en de query waarbij hij daadwerkelijk gebruikt wordt afgesloten te worden. Draait Tomcat meerder Servlet instanties tegelijk?
Ik wil graag mijn context kunnen reloaden, maar daarvoor moet ik netjes alle connecties afsluiten, anders krijg je locking problemen (Tomcat houdt lock op database.lck, maar de oude servlet instantie is wel opgeruimd door de gc. => applicatie dood).
Iemand enig idee hoe dit op te lossen is? Liefst wil ik ook de inprocess mode blijven gebruiken.
De niet relevante code heb ik er even uitgesloopt voor leesbaarheid.
Het probleem met onderstaande code is dat deze bij veel requests (ik simuleer dat even door Ctrl-R ingedrukt te houden) een "Access is denied: Session is closed" melding geeft. Google was niet erg behulpzaam, en ik denk dat ik eigenlijk ook wel weet wat het betekend. De database connectie lijkt tussen de getConnection() binnen doPost en de query waarbij hij daadwerkelijk gebruikt wordt afgesloten te worden. Draait Tomcat meerder Servlet instanties tegelijk?
Ik wil graag mijn context kunnen reloaden, maar daarvoor moet ik netjes alle connecties afsluiten, anders krijg je locking problemen (Tomcat houdt lock op database.lck, maar de oude servlet instantie is wel opgeruimd door de gc. => applicatie dood).
Iemand enig idee hoe dit op te lossen is? Liefst wil ik ook de inprocess mode blijven gebruiken.
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
36
37
38
39
40
41
42
43
44
45
| public class AutoComplete extends HttpServlet { private Connection c; public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // contenttype, headers, querystring opvragen etc. try { Connection c = null; c = getConnection(); Statement sqlStatement = c.createStatement(); String sql = "SELECT term FROM table WHERE x='y%'"; ResultSet res = sqlStatement.executeQuery(sql); while(res.next()) { //recordset verwerken } } catch (SQLException e) { // errors catchen, hier komt die SqlException vandaan } finally { try { closeConnection(); // errors catchen } } private void closeConnection() throws ClassNotFoundException, ServletException, SQLException { Connection c = getConnection(); Statement s = c.createStatement(); s.executeUpdate("SHUTDOWN"); c.close(); } private Connection getConnection() throws ClassNotFoundException, ServletException, SQLException { if(c!=null) { if(!c.isClosed()) return c; } Class.forName("org.hsqldb.jdbcDriver" ); String db_path = settings.getDb(); String db = getServletContext().getRealPath(db_path); c = DriverManager.getConnection("jdbc:hsqldb:file:"+db, "sa", ""); return c; } } |
De niet relevante code heb ik er even uitgesloopt voor leesbaarheid.
You can't have everything. Where would you put it?