Toon posts:

[JAVA] probleem bij inserten 1e record in Sybase-tabel

Pagina: 1
Acties:

Verwijderd

Topicstarter
Na lang zoeken op GoT en zelf trachten een oplossing te vinden, wat vruchteloze pogingen zijn gebleken... toch maar besloten om hier mijn probleem voor te leggen.

Het zit zo: De opdracht die uitgevoerd moet worden is om een messenger te programmeren, die gebruik maakt van RMI, Sybase en Java. Het RMI gedeelte is vooralsnog geen probleem. Het probleem zit 'm juist in het inserten van een allereerste record in de database die is opgezet om gegevens van gebruikers in te bewaren.

De DDL van de betreffende tabellen waarbij het mislukt:

CREATE TABLE gebruiker (
email text NOT NULL,
fullname text,
screenname text NOT NULL,
address text,
telephone text,
extra text,
id text NOT NULL,
PRIMARY KEY (id) ,
);


CREATE TABLE contactgroup (
contactgroep_id int NOT NULL,
user_id text NOT NULL,
contactgroupnaam text NOT NULL,
primary key (contactgroep_id),
foreign key (user_id) references gebruiker
);

CREATE TABLE contact (
contactgroep_id int NOT NULL ,
contact_id text NOT NULL ,
contact_status text default NULL,
foreign KEY (contactgroep_id) references contactgroup
);

CREATE TABLE login_geb (
user_id text NOT NULL,
email text NOT NULL,
wachtwoord text NOT NULL,
PRIMARY KEY (email),
foreign key (user_id) references gebruiker
);

Ongeacht in welke tabel ik ook iets in wil voeren het mislukt als ik het vanuit mijn Java - Odbc klasse uitvoer. Maar! als ik de regel "handmatig" invoer in de console die is bijgeleverd bij Sybase, dan wordt de regel keurig toegevoegd.

Aangezien ik ook een aantal System.out.println 's in de Java code heb gezet kan ik precies zien welke Sql-query er wordt verstuurd. Deze query's zijn mijns inziens goed, aangezien ze wel werken bij het handmatig invoeren zoals eerder gezegd.

Het verhaal wordt nog interessanter, op het moment dat ik een record wil inserten vanuit Java, en de tabel is niet leeg, (dus het record wat ik dan toevoeg is niet het eerste record) dan verloopt het goed, en wordt het record keurig ge-insert.

Dus nu is mijn vraag, wie weet wat ik verkeerd doe, en wat ik er aan kan doen.

Onderstaand is een sql-query die ik opbouw in mijn java-code, en die dus mislukt.

insert into gebruiker values('aw@hotmail.com','ton','testton','ttt','06189','geen','1');


Wie helpt? Bvd!

  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 15:47
Ik neem aan dat je bij het inserten in java een SQLException krijgt? zou je de message daarvan misschien willen posten?

[ Voor 6% gewijzigd door Jelmer op 31-10-2003 23:27 ]


Verwijderd

Topicstarter
Jelmer schreef op 31 oktober 2003 @ 23:27:
Ik neem aan dat je bij het inserten in java een SQLException krijgt? zou je de message daarvan misschien willen posten?
Nee dat is juist het vreemde, die krijg ik niet, dat zou het probleem aanzienlijk vergemakkelijken. Het java-programma loopt simpelweg vast, en ik krijg ook geen stacktrace. Dus onduidelijk wat er misgaat.

  • zneek
  • Registratie: Augustus 2001
  • Laatst online: 08-02-2025
Verwijderd schreef op 31 oktober 2003 @ 23:29:
[...]


Nee dat is juist het vreemde, die krijg ik niet, dat zou het probleem aanzienlijk vergemakkelijken. Het java-programma loopt simpelweg vast, en ik krijg ook geen stacktrace. Dus onduidelijk wat er misgaat.
Connection wordt wel gemaakt? En een select? doet die iets?

[edit] Lama, inserten 2de record gaat wel goed lees ik net. Mmmm, vaag.

[ Voor 10% gewijzigd door zneek op 31-10-2003 23:48 ]


Verwijderd

Topicstarter
Ok, het probleem is nu, voor hoe lang weet ik niet, uit de wereld geholpen, door alle tables te droppen en vervolgens op nieuw aan te maken.

Mogelijk dat ook mee heeft gespeeld, dat ik terwijl het java-programma draaide ook acties uitvoerde via het console op de database.

Verwijderd

Misschien een vreemde opmerking...

Heeft dit niet te maken met exclusiviteit... als je console open staat dat andere applicaties geen dingen kunnen toevoegen of verwijderen omdat ze geen "lock" op de database kunnen krijgen omdat je console dit al heeft....

Wat er dan inderdaad zal gebeuren is dat je applicatie stopt met werken (waiting on lock) en je dus ook geen error krijgt...

Grtz Dark

Verwijderd

Je moet na het uitvoeren van de query, de (expliciete) transactie handmatig commiten. Programma code die daarvoor nodig is, heb ik hier niet bij de hand... als het niet lukt: stuur je voorbeeld klasse, dan maak ik hem voor je af.

Verwijderd

DarkyDuck: je db wordt niet gelock als er meer applicaties met die db praten.

Een lock ontstaat wanneer een applicatie een record wil updaten (dus ook deleten)
Deze lock bestaat om te de correctheid van een record en dus tabel te garanderen.

Als de console niet op hetzelfde moment in de zelfde tabel een record met dezelfde Primary Key probeert te updaten als de applicatie zal er geen lock zijn.
Lijkt me dus niet waarschijnlijk in deze situatie.

Taoufik: commit handmatig? Ik hoop dat je daarmee bedoeld in de applicatie een commit statement Connection.commit().

Maar je kan natuurlijk ook altijd de autocommit aanzetten. Connection.setAutoCommit(true)


Terug naar het probleem: TonB kan je je source hier plaatsen?

Groeten
Alex

Verwijderd

Dat is inderdaad wat ik bedoel, alwoude. Het is jammer dat we nu van de topicstarter niet te horen krijgen of het al gelukt is en zo ja, wat dan het probleem was.

Mijn eerste probleem met jdbc was ook dat het handmatig commiten van een DML terwijl ik nergens had aangegeven dat ik een expliciete transactie wilde.

Verwijderd

Topicstarter
Alex, Taoufik jullie hebben beiden gelijk, het heeft inderdaad te maken gehad met een lock op de Database. Waarschijnlijk was dit te omzeilen geweest met het door jullie genoemde Commit-statement, ik heb dit echter niet gebruikt.

Toch bedankt voor de hulp!
Pagina: 1