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?
- 1565 megtekintés
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();
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Ez tipikusan driver hiba pedig.
Valószinű más-más JDBC drivert használ a kettő, azért megy az egyik és a másik nem.
- A hozzászóláshoz be kell jelentkezni
Úgy tűnik, igazad van, de nem tudom még, honnan szedi a rendszerem a jar fájlt, elvileg nincs már fent a driver... No keresgélek egy kicsit.
--
hup.user.js
- A hozzászóláshoz be kell jelentkezni
Irasd ki a class path, library path-t a java.lang.System-el a működönél.. valahonnan csak szedi.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Nincs, mert valószínű még mindig két különböző driver van használva.:)
- A hozzászóláshoz be kell jelentkezni
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 ...
- A hozzászóláshoz be kell jelentkezni
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
--
- A hozzászóláshoz be kell jelentkezni
Te valamit nagyon elkavarsz!
Hol itt az exception a leirásodban??????????
Lefuttattam a példaprogramot a leszedett jdbc3-as driverrel, és dob semmi
hibát, sőt ha Nálad is ezeket irja ki akkor Nálad sincs hiba.
- A hozzászóláshoz be kell jelentkezni
Szervletben dob kivételt. De ha nem hiszed, odaadom a forráskódot...
--
hup.user.js
- A hozzászóláshoz be kell jelentkezni
Ú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
- A hozzászóláshoz be kell jelentkezni
Ja, én is így tudtam, csak a példaprogram ment, és ezek után elkezdtem kísérletezni, de nem sikerült megoldanom, még verziókkal sem...
Ja, ugyanazt használja a tomcat is, mint a parancssori (classpath-ban, library path-ban nincsen másik benne)
--
hup.user.js
- A hozzászóláshoz be kell jelentkezni