Thread: Statement has been closed (only in Windows)
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hi, While testing a Java app (that's been working for years with PostgreSQL + Linux) in a Windows box I get this error when inserting a record whithin a transaction: org.postgresql.util.PSQLException: This statement has been closed. ~ at org.postgresql.jdbc2.AbstractJdbc2Statement.checkClosed(AbstractJdbc2Statement.java:2390) ~ at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:329) ~ at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:278) What I was doing was to keep a single connection since the beginning until the end of the session. public class DbConnection { ~ Statement statement = null; ~ public Statement getStatement() throws SQLException ~ { ~ if( statement == null ) ~ statement = con.createStatement(); ~ return statement; ~ } } As there was only one connection established with the database (fat client), this seemed OK. As the driver, when I ran the same app in Windos, was complaining that the connection had been closed, I commented out the 'if' line above... et voilá, problem solved. New method: ~ public Statement getStatement() throws SQLException ~ { statement = con.createStatement(); ~ return statement; ~ } As I don't like this solution (either trusting the garbage collector to do his job or closing every statement after have been used), what I ask is: what is the proper way of handling this kind of problem? Testing conditions: Linux: - - Debian, Ubuntu, Gentoo, Fedora, etc. - - PostgreSQL 7.4.x - - pg74.216.jdbc3.jar Windows: - - Windows 2000, XP - - PostgreSQL 8.1 - - postgresql-8.0-314.jdbc3.jar Thanks, Carlos - -- MEMÓRIA PERSISTENTE, Lda. Tel.: 219 291 591 - GSM: 967 511 762 e-mail: geral@m16e.com - URL: http://www.m16e.com AIM: m16e - ICQ: 257488263 - Jabber: m16e@amessage.de Skype.com username (VoIP): m16e.com GnuPG: wwwkeys.eu.pgp.net -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.2 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org iD8DBQFD5k/X90uzwjA1SJURAsG+AJ0RYQalem4sTxzyQd8Z/ucKsP4YLACdGyU9 LPA+ToH9kBrgxM3kE2V1Zxg= =v2Qt -----END PGP SIGNATURE-----
Hi Carlos, if you're problem is solved what is the question?
if you worry about creating a lot of statements, don't. But make sure you close them after use. Also the resultSet if any. Not a big brain on this end, but why would you want to keep the statement open?
P.
On Sun, 2006-02-05 at 19:19, Carlos Correia wrote:
if you worry about creating a lot of statements, don't. But make sure you close them after use. Also the resultSet if any. Not a big brain on this end, but why would you want to keep the statement open?
P.
On Sun, 2006-02-05 at 19:19, Carlos Correia wrote:
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hi, While testing a Java app (that's been working for years with PostgreSQL + Linux) in a Windows box I get this error when inserting a record whithin a transaction: org.postgresql.util.PSQLException: This statement has been closed. ~ at org.postgresql.jdbc2.AbstractJdbc2Statement.checkClosed(AbstractJdbc2Statement.java:2390) ~ at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:329) ~ at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:278) What I was doing was to keep a single connection since the beginning until the end of the session. public class DbConnection { ~ Statement statement = null; ~ public Statement getStatement() throws SQLException ~ { ~ if( statement == null ) ~ statement = con.createStatement(); ~ return statement; ~ } } As there was only one connection established with the database (fat client), this seemed OK. As the driver, when I ran the same app in Windos, was complaining that the connection had been closed, I commented out the 'if' line above... et voilá, problem solved. New method: ~ public Statement getStatement() throws SQLException ~ {statement = con.createStatement(); ~ return statement; ~ } As I don't like this solution (either trusting the garbage collector to do his job or closing every statement after have been used), what I ask is: what is the proper way of handling this kind of problem? Testing conditions: Linux: - - Debian, Ubuntu, Gentoo, Fedora, etc. - - PostgreSQL 7.4.x - - pg74.216.jdbc3.jar Windows: - - Windows 2000, XP - - PostgreSQL 8.1 - - postgresql-8.0-314.jdbc3.jar Thanks, Carlos - -- MEMÓRIA PERSISTENTE, Lda. Tel.: 219 291 591 - GSM: 967 511 762 e-mail: geral@m16e.com - URL: http://www.m16e.com AIM: m16e - ICQ: 257488263 - Jabber: m16e@amessage.de Skype.com username (VoIP): m16e.com GnuPG: wwwkeys.eu.pgp.net -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.2 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org iD8DBQFD5k/X90uzwjA1SJURAsG+AJ0RYQalem4sTxzyQd8Z/ucKsP4YLACdGyU9 LPA+ToH9kBrgxM3kE2V1Zxg= =v2Qt -----END PGP SIGNATURE----- ---------------------------(end of broadcast)--------------------------- TIP 4: Have you searched our list archives? http://archives.postgresql.org
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 pedro farinha escreveu: | Hi Carlos, if you're problem is solved what is the question? | if you worry about creating a lot of statements, don't. But make sure | you close them after use. Also the resultSet if any. Not a big brain on | this end, but why would you want to keep the statement open? Well, why not? It's a fat client, It establishes a connection at application start up and closes it once the app finishes... what's the problem about keeping the same statement (it's been working like that in a production environment for years in Linux)? Anyway, after I made the workaround I mentioned in a previous post (creating a new statement per request), began getting errors in prepared statements, which I'll try to reproduce (tomorrow?) and published them here. The questions now are: - - How stable is PostreSQL on a Windows environment, by now? - - Are there any known problems with transactions, prepared statements or storeed procedures in a Windows environment? Thanks, Carlos - -- MEMÓRIA PERSISTENTE, Lda. Tel.: 219 291 591 - GSM: 967 511 762 e-mail: geral@m16e.com - URL: http://www.m16e.com AIM: m16e - ICQ: 257488263 - Jabber: m16e@amessage.de Skype.com username (VoIP): m16e.com GnuPG: wwwkeys.eu.pgp.net -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.2 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org iD8DBQFD6Sio90uzwjA1SJURAu43AJ9t6YzRnncHCBbxsdbe111jFWVzWQCgo3T1 fnnTxAl/v+irDbYrRyq2Xt0= =/OV6 -----END PGP SIGNATURE-----
El Martes, 7 de Febrero de 2006 19:09, Carlos Correia escribió: > pedro farinha escreveu: > | Hi Carlos, if you're problem is solved what is the question? > | if you worry about creating a lot of statements, don't. But make sure > | you close them after use. Also the resultSet if any. Not a big brain on > | this end, but why would you want to keep the statement open? > > Well, why not? It's a fat client, It establishes a connection at > application start up and closes it once the app finishes... what's the > problem about keeping the same statement (it's been working like that in > a production environment for years in Linux)? > Maybe your problem is more related to the transition from postgres (and its JDBC driver) from 7.x to 8.x. Why not you try your migration in steps 1. Migrate to Postgres 8.x (and its JDBC driver) on Linux 2. Migrate from linux to windows. I think that the step to may be easer than step 1 due to changes related to use network protocol version 3 and serverside prepare statement. Nelson Arapé