JDBC Transaktion autocommit

Tallan

Bekanntes Mitglied
Hallo zusammen,

ich habe folgendes beobachtet und bin mir nicht sicher ob das so sein sollte...


ich hab eine connectionpool der anbindungen an die DB zur verfügung stellt.
wenn ich nun bei einer vorhandenen verbindung autoconnect ausschalte und danach eine Select anweisung ausführe kommt sofern ich danach einen commit auf dieser connection mache
die fehlermeldung das ein commit nicht möglich ist solange autocommit true ist.

Beispiel :

Java:
	//Connection holen
    	Connection con = ConnectionPool.getConnection();
        con.setAutoCommit(false);
        System.out.println("Autocommit : " + con.getAutoCommit()); // ergebnis ist false
        
        ResultSet rsUserName = executeQuery(con, "Select ......");
        
        System.out.println("Autocommit : " + con.getAutoCommit()); // ergebnis ist false
        //commiten
	    con.commit();  // HIER TRITT DER FEHLER AUF 
	    //zurücksetzen
	    con.setAutoCommit(true);
	    //freigeben
		ConnectionPool.freeConnection(con);

Mir ist klar das es sich dabei nur um eine lesende Anfrage handelt und keine Daten geschrieben werde womit die Transaktion nicht nötig ist aber warum diese Fehlermeldung

java.sql.SQLExeption : Can't call commit when autocommit=true
...
 
M

maki

Gast
Wie werden denn die Connections im Pool erzeugt?
Unterstützt die DB auch Transaktionen? Ist nicht immer der Fall, siehe zB. MySQL MyISAM Tabellen...
 

Tallan

Bekanntes Mitglied
Die Datenbank unterstützt transkationen, das habe ich auch getestet
Engine ist InnoDB

Anbei wie die Connection erstellt wird

Java:
private static Connection createConnection() {
		Connection conn = null;
		try {

			try {
				Class.forName("com.mysql.jdbc.Driver").newInstance();
			} catch (InstantiationException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			conn = DriverManager.getConnection("jdbc:mysql://<<IP>>/<<Datenbank>>","<<Login>>","<<PW>>");
	
		} catch (SQLException ex) {
			ex.printStackTrace();
		}
		return conn;
 
M

maki

Gast
Versuche mal bei der Erstelluing bereits festzulegen das autocommit off ist, ansonsten kannst du ja prüfen ob autocommit an oder aus ist, die JdbcConnection sollte doch eine Methode dafür haben.
 

Tallan

Bekanntes Mitglied
Hab ich schon siehe erster Post
System.out.println("Autocommit : " + con.getAutoCommit());

die Angebe gibt false zurück und bei einem con.commit kommt die Fehlermeldung das das nicht geht wenn autocommit = true ist;)
 
M

maki

Gast
Naja, du brauchst auf jedenfall kein commit bei einer Select Query, ist das "Problem" denn wirklich eines?
 

Manuela

Aktives Mitglied
Hallo besteht dein Problem immer noch?

Java:
    //Connection holen
        Connection con = ConnectionPool.getConnection();
        con.setAutoCommit(false);
        System.out.println("Autocommit : " + con.getAutoCommit()); // ergebnis ist false
        
        ResultSet rsUserName = executeQuery(con, "Select ......");
        
        System.out.println("Autocommit : " + con.getAutoCommit()); // ergebnis ist false
        //commiten
        con.commit();  // HIER TRITT DER FEHLER AUF 
        //zurücksetzen
        con.setAutoCommit(true);
        //freigeben
        ConnectionPool.freeConnection(con);
Ich habe das so gemacht bei mir geht das
Java:
        c = con.getConnection();
        c = Connector.getInstance().getConnection();
         c.setAutoCommit(false);
        try {
          String sql="...";
          java.sql.CallableStatement call = c.prepareCall(sql);
     

  ...

            call.close();

  

               c.commit();

        } catch (SQLException ex) {
                  c.rollback();
         
        }
vielleicht hilft Dir das.
Gruß Manuela
 

Ähnliche Java Themen

Neue Themen


Oben