java, postgresql autocommit

Fórumok

Javában PostgreSQL-hez akarok olyan kódot írni, amiben az autocommit ki van kapcsolva, azonban ezt nem engedi meg valamiért a kapcsolat:
A conn.setAutoCommit(false); szépen kivételt dob, a postgresql.org-ról letöltött jdbc3-as (postgresql 8.0.12-höz) példaprogram: example/threadsafe.java viszont működik. Az egyetlen különbség, hogy a példa parancssori, az enyém meg egy tomcatben futó szervlet.

Valakinek van ötlete, hogy tudnám kikapcsolni az autocommitot?

Hozzászólások

Esetleg érdekes lehet, hogy milyen kivételt dob.

Meg lehet próbálkozni azzal, hogy plain sql update-ként beküldesz egy ilyen üzenetet:

Statement stmt=conn.createStatement("set autocommit off");
stmt.executeUpdate();

Kivétel toString után: ApplicationException: Unable to turn off autocommitjava.sql.SQLException: ERROR: SET AUTOCOMMIT TO OFF is no longer supported

szerk: nem segít a statement használat sem, mert ugyanez a hiba.

stmt = conn.prepareStatement("$ELECT nextID FROM KEYS WHERE name = ? FOR UPDATE")
stmt = null;
stmt = conn.prepareStatement("UPDATE KEYS SET nextID = ? WHERE name = ?");

ennek kellene lefutnia, két részletben, és nem találok értelmes megoldást rá (még).

--
hup.user.js

Megvan...
Netbeans 5.5-öt használok, kiszedtem az IDE Projects Libraries listájából a postgresql jar fájlját, csakhogy a build könyvtárban + a war fájlban bent hagyta :S

No, most pepitában ugyanaz a kód, mint a példában, ámde így is elszáll. Nincs szerencsém.

--
hup.user.js

Direktben éred el a drivert, vagy Tomcat-en keresztül?

Úgy tudom, hogy ha Tomcat alatt a Tomcat context-ben definiált datasource-on keresztül kapcsolódsz egy adatbázishoz, akkor a Tomcat-ben lévő wrapper osztályok elfedik az eredeti drivert.
Én pl. így használom, hogy a context-ben adom meg a datasource paramétereit, és a servletben így szerzem meg a datasource-ot:


InitialContext ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:/comp/env/jdbc/akarmi");

Próbáld meg direkt módon használni a drivert a DriverManager.getConnection használatával, hátha ...

DriverManager-t vagy PGPoolingDataSource-ot használok (utóbbit szándékoztam használni)

Példakód (rövid változat): http://panther.inf.elte.hu/java/threadsafe.java

Kimenet:
PostgreSQL Thread Safety test v6.4 rev 1

Connecting to Database URL = jdbc:postgresql:panther
Connected...Now creating a statement
Connected...AFTER set autocommit false
Now closing the connection

A servletes kódomban pedig ThreadLocal változóban tárolom el a kapcsolatot, és azt leszámítva ugyanígy töltöm be, kapom meg, és nem megy :S
--

hup.user.js

Úgy tudom, hogy a 7.4 táján _megszűnt_ az autocommit, tehát minden tranzakció elején-végén explicite ki kell adni a begin-commitot.

--
CCC3