URL: https://www.overclockers.at/coding-stuff/java_denkfehler_bei_static-variablen_193323/page_1 - zur Vollversion wechseln!
jaa, ich bins wieder
so. zuerst - als es nur eine mögliche DB für mein java-prog gab - hab ich die die verbindungsdaten (db-name, server, user, pw...) in eine eigene klasse DBConfig geschrieben. das hat so ausgesehen:
Code: PHPpublic static final String DB_NAME="JSTW"; public static final String DB_USER = "NIKP"; public static final String DB_SERVER = "XNIKP"; public static final String DB_URL = "jtds:jdbc:sqlserver://";
Code: PHPpublic static String DB_NAME="JSTW"; public static String DB_USER = "NIKP"; public static String DB_SERVER = "XNIKP"; public static final String DB_URL = "jtds:jdbc:sqlserver://";
Code: PHPDocument doc = builder.parse(xmlFile); DBConfig.DB_SERVER = doc.getElementsByTagName("db-server").item(0).getTextContent();
Code: PHPDBAccess.checkIfUserExists(username);
Code: PHPConnection knexon = dbpool.getConnection();
Wenn ich das hier (http://java.sun.com/docs/books/jls/....doc.html#10931) richtig verstehe, dann darf einer final Variable nur einmal ein wert zugewiesen werden.
Und du weist ja schon bei der Definition der Variable einen Wert zu.
Ich hoffe ich habe jetzt keinen kompletten Blödsinn geschrieben
Zitat von Triple-XWenn ich das hier (http://java.sun.com/docs/books/jls/....doc.html#10931) richtig verstehe, dann darf einer final Variable nur einmal ein wert zugewiesen werden.
kriegst du denn keine fehlermeldung(en) ?
nö, woher auch? es funktioniert ja, er nimmt nur die alten (quasi die standardwerte in der DBConfig) werte her, die ja die richtigen sind...
ich hab hier mal das wichtigste von den 3 DB-klassen gezippt. was im hauptprogramm passiert, steht eh im ersten post.
hth
aso. na das programm verwendet ja die daten wie sie gesetzt wurden bevor du sie verwendest. wenn du den wert einer konstanten einer anderen konstanten zuweist bleibt ja die "alte" kopie auch wenn du die referenz (Klasse) veränderst.
does that help?
btw: wie schaut die datei auf wo du veränderst und aufrufst im ganzen?
Zitat von Nicoaso. na das programm verwendet ja die daten wie sie gesetzt wurden bevor du sie verwendest. wenn du den wert einer konstanten einer anderen konstanten zuweißt bleibt ja die "alte" kopie auch wenn du die referenz (Klasse) veränderst.
does that help?
Öhm rufst du zwischendurch zufällig releaseConnection() auf? Sprich du erzeugst ein paar Connections mit den alten Zugangsdaten, gibst sie wieder in den Pool und jetzt wunderst du dich, warum du mit getConnection() Connections mit den alten Daten kriegst?
Mein Tipp: Wenn du neue Konfigurationsdaten einliest, rufst du DBConnectionPool.getInstance().clear() auf, die folgendes macht:
...oder (was noch besser wäre): Du kübelst die statischen Felder von DBConfig und machst es zu einer Klasse mit gettern für DB-Name, etc. So ein Objekt könntest du dann an DBConnectionPool.setConfig(DBConfig newConfig) übergeben und erzeugt wird so ein DBConfig Objekt mit statischen Erzeugern, á la DBConfig config = DBConfig.getDefaultConfig() oder DBConfig newConfig = DBConfig.readConfig(Document doc); (dazu machst du den Konstruktor von DBConfig am besten private).Code:public synchronized void clear() { // ... alle Connections schließen connections.clear(); }
Zitat von gueÖhm rufst du zwischendurch zufällig releaseConnection() auf? Sprich du erzeugst ein paar Connections mit den alten Zugangsdaten, gibst sie wieder in den Pool und jetzt wunderst du dich, warum du mit getConnection() Connections mit den alten Daten kriegst?
kommt ca auf das was ich meinte, nur das du es nicht selbst geschrieben hast
Zitat von gueÖhm rufst du zwischendurch zufällig releaseConnection() auf? Sprich du erzeugst ein paar Connections mit den alten Zugangsdaten, gibst sie wieder in den Pool und jetzt wunderst du dich, warum du mit getConnection() Connections mit den alten Daten kriegst?
Vermutlich hast du ConnectionPool nicht neu kompiliert, nachdem du die Variablen von static final auf static geändert hast (und nein, das muss man sonst nicht immer machen aber static finals werden als Konstanten angesehen und in das verwendende Classfile importiert (es wird keine Referenz auf die deklarierende Klasse erzeugt)).
Zitat von gueVermutlich hast du ConnectionPool nicht neu kompiliert, nachdem du die Variablen von static final auf static geändert hast
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025