Toon posts:

[Java] Access violation bij database update

Pagina: 1
Acties:
  • 795 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hoi,

Ik weet niet waar het aan ligt maar telkens als ik een specifieke methode aanroept krijg ik een EXCEPTION _ACCES_VIOLATION error. De compiler zegt dat er buiten de JVM iets fout is gegaan.

Het onderstaande stukje source code werkt perfect. Wat het onderstaande source code doet is het invoeren van gegevens van een DomainObject in een database.
code:
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
  protected String insertStatement()
  {
    return "insert into Nodes (stadNaam,xCoordinaat,yCoordinaat) values(?,?,?)";
  }

 protected void insert(DomainObject obj) throws SQLException
  {

  PreparedStatement insertStatement = null;
  try
  {
    insertStatement = DB.getConnection().prepareStatement(insertStatement());

    WVertex wvertex = (WVertex) obj;
    insertStatement.setString(1,wvertex.getName());
    insertStatement.setInt(2,wvertex.getXCoord());
    insertStatement.setInt(3,wvertex.getYCoord());

    insertStatement.execute();

  }
  catch(SQLException e)
  {
    System.out.println("SQLException abstractmapper insert"+ e.toString());
  }
  finally
  {
     DB.cleanUp();
  }
 }



Het onderstaande stukje source code lijkt veel op het bovenstaande stukje source code. Het verschil is dat er een update wordt uitgevoerd. Ik heb de update query getest en deze werkt gewoon. Maar het gaat fout bij de regel dat vet gedrukt is. Ik snap niet wat er aan de hand is (de insert methode werkt gewoon maar de update niet?
code:
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
  protected String updateStatement()
  {
    return "update nodes set stadNaam=?, xCoordinaat=?, yCoordinaat=? where IdNode=?";
  }

 protected void update(DomainObject obj) throws SQLException
  {
    PreparedStatement updateStatement = null;
    try
    {
     [b] updateStatement = DB.getConnection().prepareStatement(updateStatement());[/b]

      WVertex wvertex = (WVertex) obj;
      updateStatement.setString(1,wvertex.getName());
      updateStatement.setInt(2,wvertex.getXCoord());
      updateStatement.setInt(3,wvertex.getYCoord());
      updateStatement.setInt(4,wvertex.id);
      updateStatement.execute();
    }
    catch(SQLException e)
    {
          System.out.println("SQLException WVertexMapper update"+ e.toString());
    }
    finally
   {
     DB.cleanUp();
   }

  }


ligt het aan de source code van mij of aan iets anders? Is dit gewoon een bug van java zelf (1.4)?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-04 17:49

NMe

Quia Ego Sic Dico.

Even wat hoofdletters uit je titel gehaald. ;)

Access violations hebben te maken met het aanspreken van geheugen waar je niet aan mag. Meestal heeft dat iets te maken met het aanspreken van objecten die nog niet geïnstantieerd zijn of iets dergelijks. Ik ken zelf geen Java, dus ik heb geen idee in hoeverre dit voor jou opgaat, maar ik zou het nog eens dubbelchecken als ik jou was. Het lijkt me in elk geval heel erg sterk dat het een bug in Java zelf is. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Ikzelf word een beetje in de war gebracht doordat je variabele-namen gebruikt met dezelfde naam als methoden. Maar Java zelf zou daar wel tegen moeten kunnen... toch?

Siditamentis astuentis pactum.


  • Guldan
  • Registratie: Juli 2002
  • Laatst online: 12-04 23:07

Guldan

Thee-Nerd

wat voor database gebruik je. Ikzelf heb deze fouten om de haverklap vanwege het gebruik van een Acces database. Vooral i.c.m. threads. Ik vermoed dat je probeert te schrijven en te lezen tegelijkertijd. Maar een oplossing heb ik ook nog niet gevonden.

You know, I used to think it was awful that life was so unfair. Then I thought, wouldn't it be much worse if life were fair, and all the terrible things that happen to us come because we actually deserve them?


  • qless
  • Registratie: Maart 2000
  • Laatst online: 12-04 20:29

qless

...vraag maar...

Guldan schreef op zondag 05 februari 2006 @ 20:59:
wat voor database gebruik je. Ikzelf heb deze fouten om de haverklap vanwege het gebruik van een Acces database. Vooral i.c.m. threads. Ik vermoed dat je probeert te schrijven en te lezen tegelijkertijd. Maar een oplossing heb ik ook nog niet gevonden.
Geen access? ;)

Ik los dat soort dingen op door een linkedlist te gebruiken (ivm first - in , first - out) die 1 voor 1 de db akties uitvoert

Website|Air 3s|Mini 4 Pro|Avata 2|Canon R6|Canon 5d2|8 fisheye|14f2.8|24f2.8|50f1.8|135f2|10-22|17-40|24-105|70-300|150-600


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 11-04 03:15
Verwijderd schreef op zondag 05 februari 2006 @ 18:19:
ligt het aan de source code van mij of aan iets anders? Is dit gewoon een bug van java zelf (1.4)?
Als de VM crasht dan ligt dat per definitie niet aan jouw code - dat hoor je namelijk niet te kunnen vanuit Java. ;)

De oorzaak zit dus in ofwel de gebruikte JVM, of, en dit lijkt mij veel waarschijnlijker, de database module die gebruikt wordt. Dit zal wel een third party library zijn met een bug er in en die kan wél de VM laten crashen. Zeker gezien het feit dat de boel alleen crasht bij het uitvoeren van een database operatie lijkt me dat de bug zeker niet in de JVM zit.

Om het concreet op te lossen is het handig om te weten wat voor database module je gebruikt. Misschien is er een nieuwe versie beschikbaar en zoniet kun je misschien op de een of andere manier om het probleem heenwerken.

[ Voor 15% gewijzigd door Soultaker op 05-02-2006 21:22 ]


Verwijderd

Het is erg belangrijk te weten welke JDBC driver je gebruikt. Standaard zit er bij Java de JDBCODBC driver. Die is niet thread-safe. Daarom ging het mis voor Guldan.

Eigenlijk is die JDBC driver een enorm verouderde *baggerdriver* van versie 1.0.

Het beste kan je een JDBC driver nemen die in Java geschreven is.

http://www.javaworld.com/...07-2000/jw-0707-jdbc.html
http://java.sun.com/j2se/.../getstart/bridge.doc.html

Ennee om weer ontopic te komen, ben je zeker van dat je niet een rij toevoegt aan de tabel Nodes die niet een unieke primaire sleutel heeft?? De prepared statement die je gebruikt doet immers een update. Daarbij wordt de primaire sleutel niet gewijzigd. Dit is een vaak voorkomende fout bij mijzelf.

En als je een baggerdriver hebt dan krijg je vaak van die vage foutmeldingen.... :-)

Verwijderd

Topicstarter
Ik gebruik MS Acces als database. Een tijdje te googlen les ik inderdaad dat er veel problemen zijn met de driver. maar wat ik niet begrijp is dat het ophalen van gegevens uit die ms acces database dat het perfect gaat. Alleen het invoeren en het wijzigen crasht het hele gebeuren. Wat ik nu aan het maken ben is een single user applicatie dus multi threading komt niet voor.

#edit# ik ga in iedergeval de verschillende drivers eens proberen.

[ Voor 9% gewijzigd door Verwijderd op 06-02-2006 12:50 ]


  • bvp
  • Registratie: Maart 2005
  • Nu online

bvp

Wat gebeurt er in je DB.cleanup() ?

Waar het misschien? aan kan liggen is dat je je resultset, statement EN connectie moet sluiten voordat je een nieuwe query doet.
Bij de nieuwe query dus weer nieuwe aanmaken en connectie openen.

Weet alleen niet zeker of dit een accesviolation bij Acces zou kunnen geven als dit niet gebeurt.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private void closeConnection(Connection con, PreparedStatement stmt, ResultSet result) {
        try {
            // Close result set.
            if (result != null) { 
                result.close();
            }
            // Close prepared statement.
            if (stmt != null) { 
                stmt.close();
            }
            // Close connection to the database.
            if (con != null) {
                con.close();
            }
        } 
        catch( Exception e ) {
            // Handle Exception.
        }
    }
Pagina: 1