Problem mit Java Servlet und Tomcat 7 (in Eclipse Helios)

ich hab vergessen, die datenbank zu starten...:rotfl:

oh mann... :faint:

es geht jetzt...


*virtuell bier austeil*
 
ja das schrieb ich weiter oben auch schon. Wenn er das haben mag, soll er Netbeans nehmen, da geht es mit registrierten und brav zum Projekt hinzugefügten Libraries :jaja:

Für mich war es aber zum lernen besser zu wissen was da alles von wo nach wo mußte. Diese Automatismen sind toll für eine schnelle Lernbelohnung, der Fußweg ist aber der lehrreichere meine ich.
Da hast du recht. ich habs z.B. zu Fuss auf AS400 und bzw auf nem pc gelernt. Ohne Netbeans, ohne ant, ohne tomcat (mit einem Texteditor, javac, servlet express bzw später websphere).
 
ein Klassiker ;-) Je frustrierter du vor deinem Code sitzt, umso weniger siehst du die einfachsten Fehler. Das ist normal, man kann das nur "organisatorisch" beheben - ne Runde schwimmen gehen, zu zweit programmieren, ... jetzt weisst du, warum es z.B. in der Luftfahrt checklisten gibt ....
 
yo...zwar wird extreme programming bei uns an der FH zwar propagiert, aber an der umsetzung hapert's...vor allem, wenn der teampartner sich ohne bescheidzugeben einfach verpisst... :mad:
 
yo...zwar wird extreme programming bei uns an der FH zwar propagiert, aber an der umsetzung hapert's...vor allem, wenn der teampartner sich ohne bescheidzugeben einfach verpisst... :mad:

:D ja so lernt man Leute kennen! Wir hatten damals ein Projekt mit vier Programmierern. War alles toll, bis einen Tag vor der Abgabe meine Virtuelle CPU nicht mehr zu funktionieren schien und einen Fehler nach dem anderen auslöste ( das Wort Exception kannten wir damals noch nicht, ebenso waren Objekte noch nicht sehr verbreitet).
Mein beteuern an der CPU-Software seit einer Woche nichts mehr geändert zu haben half mir auch nix. Ein einziger blieb und durchforstete bis Nachts um drei mit mir meinen Code. Die anderen waren pünktlich ins Bettchen weil sie ja ihren Teil abgeben mußten meinten sie ( Danke auch :) ).
Das endete dann wie es mußte. Um halb drei hatten wir herausgefunden, das der der als erster ging einen Copy/Paste-Fehler gemacht hatte und so geschlagene fünf Prozeduren identische Funktion hatten statt angepaßt zu sein und somit Bullshit-Antworten an meine CPU gaben. Wir haben also seine Software zu Ende geschrieben, die vier Teile neu zusammencompiliert und sind um 3 Uhr nach Hause um um 6 wieder aufzustehen und die Abgabe vorzubereiten ( 100 Seiten Listingdruck mit einem 9-Nadeldrucker ;) ).

Die Gesichter waren aber unbezahlbar als wir erzählen konnten das wir den Fehler gefunden hättem, zumal der Übeltäter ja sein falsches gedrucktes Listing dabei hatte am nächsten Tag :D
 
hi!

ich hab folgenden code, um prepared statements zu machen (hier insert):

Code:
public class DBConnMgrServlet extends HttpServlet {
	
	/**
	 * standardkrempel...brauch man das?
	 */
	private static final long serialVersionUID = 1L;

	final static String host = "localhost";
	final static String userid = "root";
	final static String passwd = "geheim";
	final static String dbname = "myclicker";
	final static String port = "3306";
	static String connStr = "jdbc:mysql://"+ host + ":" + port + "/" + dbname;
	PreparedStatement pstmt = null;
	String selectString = "SELECT shortname FROM fragestellung WHERE aktiv=?";
	String insertString = "INSERT INTO metadaten_http VALUES (?,?)";
	int id = 1;
	String ipaddr = "192.168.10.2";
	
	public DBConnMgrServlet() {
		super();
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
	throws ServletException, IOException {
		Connection conn=null;
		PrintWriter out = resp.getWriter();
		try {
			Class.forName("com.mysql.jdbc.Driver").newInstance();
			conn = DriverManager.getConnection(connStr, userid, passwd);
			out.println("Verbindung zu \t" + dbname + "\t hergestellt!");
			pstmt = conn.prepareStatement(insertString);
			pstmt.setInt(1, id);
			pstmt.setString(2, ipaddr);
			pstmt.executeUpdate();
			out.println("insert erfolgreich");
		} catch (InstantiationException e) {
			e.printStackTrace();
			out.println("Error! Instantiation failed!\n" + e);
		} catch (IllegalAccessException e) {
			e.printStackTrace();
			out.println("Error! Illegal Access on DataBase: " + dbname +"\n" + e);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			out.println("Error! Class not found!\n" + e);
		} catch (SQLException e) {
			e.printStackTrace();
			out.println("Error! SQL Exception!\t" + e + " SQLState:\t " + e.getSQLState());

		}  
		
	}
}

beim testen kommt:

Code:
Error! SQL Exception!
java.sql.SQLException: null,  message from server: "Host '192.168.2.102' is not allowed to connect to this MySQL server"
SQLState:	 HY000

:noplan:

wo liegt mein fehler?
 
genau da wo es auch steht:

Host '192.168.2.102' is not allowed to connect to this MySQL server

Du muißt den Zugriff erlauben. Per my.cnf ggf. und in jedem Fall per Usertablle in MySQL. Denn dort wird ja zwischen localhost und anderen hosts unterschieden. Probier es einfach mal zunächst mit einem schnöden mysql im Terminal. Klappt der connect, kann es auch aus Java heraus funktionieren.
 
äh...ok...jetzt verwundert's mich nicht mehr...wieso macht der das nicht über den localhost?


btw: is der eintrag in die my.cnf ein bind?
 
wollt nur sicher gehen... ;)
 
ok...host wird nun angenommen. aber ich glaub mein statement ist nicht richtig...

Code:
package org.fhffm.servlet;
...

/**
 * 
 * @author naphaneal
 *
 */

public class DBConnMgrServlet extends HttpServlet {
	
...
	final static String host = "localhost";
	final static String userid = "root";
	final static String passwd = "geheim";
	final static String dbname = "myclicker";
	final static String port = "3306";
	static String connStr = "jdbc:mysql://"+ host + ":" + port + "/" + dbname;
	PreparedStatement pstmt = null;
	String selectString = "SELECT shortname FROM fragestellung WHERE aktiv=?";
	String insertString = "INSERT INTO metadata_http VALUES (?,?,?)";
	int id = 1;
	String ipaddr = "192.168.10.2";
	...
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
	throws ServletException, IOException {
		Connection conn=null;
		PrintWriter out = resp.getWriter();
		try {
			Class.forName("com.mysql.jdbc.Driver").newInstance();
			conn = DriverManager.getConnection(connStr, userid, passwd);
			out.println("Verbindung zu \t" + dbname + "\t hergestellt!");
			pstmt = conn.prepareStatement(insertString);
			pstmt.setInt(1, id);
			pstmt.setString(2, ipaddr);
			pstmt.executeUpdate();
			out.println("insert erfolgreich");
		}...
}


hinweis die tabelle hat einen Auto Increment für den P-key. die tabelle besteht aus drei spalten. wie müsste ich das statement abändern, daß es funktioniert?

danke!

greez

Naph
 
aber ich glaub mein statement ist nicht richtig...

meinst Du nicht auch, dass Du langsam an einer Stelle bist wo Du durchaus schon selbst schwimmen kannst!? Den Fehlerpunkt müßtest Du finden können und damit zumindest den Auslöser definieren können. Vielleicht findest Du darüber die Lösung. Wenn nicht, dann hast Du eine konkrete Frage hier fürs Forum, statt der schwammigen Laien-Aussage "ich glaub mein statement ist nicht richtig". Also schwimm mal ein zwei Bahnen allein, ohne Schwimmlehrer :)
 
@Naphaneal
Jetzt fragst du aber schon nach absoluten Grundlagen, die du in jeder SQL Dokumentation, auch in der mysql Dokumentation innerhalb weniger Sekunden findest....
Ich will mal nicht so sein: man kann dem insert statement eine Spaltenliste mitgeben, die autoincrement Spalte lässt man dann weg. Probier bitte alle statements erstmal in einem SQL Client aus (du hast doch myPhpAdmin indeinem XAMP..., sonst über die mysql tools oder auf der Kommandozeile).
(Edit: @wegus: du warst schneller und ich bin zu gutmütig. du hast aber recht..)

@Naphaneal
Und - und das ist der eigentliche Grund warum ich antworte - im Servlet für jeden Request eine eigene Connection aufzumachen ist ein Verbrechen. Das Stichwort heist ConnectionPool, oder DataSource, und es ist überhaupt einer der Gründe, eine wie auch immer ausgeprägte J2EE Umgebung einzusetzen (und wenn es wie im Tomcat nur der Web Tier ist), dass die Container (wie Tomcat) dir Pools für diese Art von Resourcen anbieten. So wie du es schreibst könnte man auch PHP nehmen oder (ich übertreibe mal etwas) eine java main class über cgi einbinden - du hast keinen Mehrwert der Infrastruktur, die du ja mit so viel Anstrengungen aufgesetzt hast... Die Probleme, in die deine Anwendung läuft, kannst du z.B. mit jMeter rausfinden, versuch doch mal ein paar Tausen Requests gleichzeitig auf dein Servlet zu schicken (es geht ja schließlich um Web ;-)
 
danke für den arschtritt...:D mein ich ernst...

ich hab's inzwischen.

@ruerueka

ich will erstmal eine connection hinkriegen, bevor ich den pool mache...
 
Code:
Error! SQL Exception!
java.sql.SQLException: null,  message from server: "Host '192.168.2.102' is not allowed to connect to this MySQL server"
SQLState:	 HY000

ok, hierzu hab ich ein echtes verständnisproblem.

für die datenbankverbindung hab ich zu testzwecken alle angaben fest vorgegeben.
als host ist der localhost angegeben, der sich zu der datenbank verbinden soll. wenn ich das servlet nun ausführe, krieg ich oben besagte meldung, daß entsprechender host nicht erlaubt ist.

warum nimmt er überhaupt diesen host und nicht "localhost" wie angegeben?
 
Das sieht nach einer schiefen Netzwerkkonfiguration aus.
1) wie wird denn localhost bei dir aufgelöst? mach mal ping localhost im Terminal...
2) Versuche mal statt mit localhost mit 127.0.0.1 zuzugreifen.
3) du kannst dich (hoffe ich ;-) im Terminal auch direkt mit dem mysql client verbinden, gib mal mysql --host=localhost ein, ob du dann das selbe Problem bekommst

edit : einfacher workaround: erlaube deinem user den Zugriff von überall oder zuindest auch von 192.168.2.102 .... siehe dazu das GRANT Kommando in der mysql Referenz.
 
ping localhost ergibt 127.0.0.1

mit 127.0.0.1 geht's auch...

zu 3. leider nein, da ich MySQL per XAMPP am laufen hab...

ich werd mal den workaround ausprobieren...
 
Zurück
Oben Unten