2010-12-10 8 views
1

Ich habe eine Seite mit Struts. Wenn es auf localhost (Glassfish) läuft, funktioniert es gut. Wenn ich jedoch WAR-Datei auf einen Remote-Server kopieren und die Anwendung von dort aus ausführen, funktioniert das Anmeldeformular nicht. Das bedeutet, dass etwas falsch ist, wenn eine Verbindung zur MySQL-Datenbank hergestellt wird.MySql funktioniert nicht von Java Web App

Wie könnte ich das lösen?

Code-Snippet:

Connection conn = null; 
    Statement stmt = null; 
    try{ 
     InitialContext ctx = new InitialContext(); 
     DataSource ds = (DataSource)ctx.lookup("jdbc/SB"); 


     conn = ds.getConnection(); 
     stmt = conn.createStatement(); 
     ResultSet rs = null; 
     if(stmt.execute("SELECT * FROM users WHERE username='"+loginform.getUsername()+"' AND geslo=MD5('"+loginform.getPassword()+"') LIMIT 1;")) 
     { 
    rs = stmt.getResultSet(); 
     } 

     rs.next(); 

Leider kann ich nicht von der Serverkonsole lesen. Was kann ich noch tun, um die Ausnahme zu sehen (Remote Logging?)?

Dank auf Antworten.

UPDATE: - Glassfish 3.0.1 wird lokal und remote ausgeführt. - Meine Arbeitsumgebung ist NetBeans 6.9.1. - Die lokale Bereitstellung erfolgt einfach in NetBeans. Ich klicke einfach auf den Projektnamen und klicke auf Veröffentlichen. Für die Remote-Bereitstellung gab mir der Admin Zugriff auf den FTP-Server, wo ich einfach die WAR-Datei kopiere. - MySQL-Server befindet sich woanders. Der Punkt ist, dass es von der Webanwendung localhost aus zugänglich ist, aber nicht von derselben entfernten Webanwendung.

+0

Verwenden Sie eine Reihe von günstigen Debuggern an jedem Punkt im Programm. sehen, was nicht auf dem Bildschirm geschrieben wird ... alte Schule, aber funktioniert. – johnny

+0

@johnny - * "Leider kann ich nicht von der Serverkonsole lesen." *. –

+0

Sie können eine bessere Antwort erhalten, indem Sie weitere Details zu Ihrer Frage hinzufügen. Welche Version von GlassFish läuft lokal? Welche Version ist die Remote-Version oder GlassFish? Wie implementierst du die App auf deinem lokalen Rechner? Wie implementierst du die App auf dem Remote-Computer? Was hat dein Administrator dir gesagt, damit du deine App bereitstellen kannst? Indem Sie detailliertere Informationen hinzufügen, werden die Leute in der Lage sein, Ihre spezielle Umgebung zu verstehen und eine Antwort für Sie zu erstellen, die verhindern wird, dass Sie einer Reihe falscher Leads folgen müssen. – vkraemer

Antwort

1

Angenommen, Sie Admin-Rechte auf dem Remote-Server haben, müssen Sie

  1. Überprüfen Sie, ob die Datenquelle "jdbc/SB" vorhanden ist.(Ressourcen/JDBC/JDBC-Ressourcen)
  2. Überprüfen Sie, ob der "poolname" in der Datenquelle vorhanden ist (Ressourcen/JDBC/Verbindungspools)
  3. Öffnen Sie den entsprechenden Verbindungspool und klicken Sie auf die Schaltfläche "ping".
  4. Wenn der Ping fehlschlägt, überprüfen Sie die Verbindungsparameter auf der Registerkarte Weitere Eigenschaften.

Es könnte noch ein Dutzend andere Probleme geben. Sie müssen wirklich Zugriff auf das Serverprotokoll erhalten, damit Sie sehen, was die spezielle Ausnahme ist. Es ist unwahrscheinlich, dass es Ihr Code und wahrscheinlicher ist, dass der Remote-Server die Treiberabhängigkeit fehlt oder nicht richtig konfiguriert ist (der Verbindungspool und eine Datenquelle)

+0

Dies ist meine Ausnahme (einfach aus dem Protokoll holen): [javax.naming.NamingException] Suche fehlgeschlagen für 'jdbc/SB' in SerialContext javax.naming.NamingException: Suche fehlgeschlagen für 'jdbc/SB' in SerialContext [Root Ausnahme ist javax.naming.NameNotFoundException: SB nicht gefunden]. Ich denke, ich muss dem Administrator mitteilen, dass er eine Datenquelle und einen Pool für mich erstellen soll. Oder kann ich irgendetwas tun, ohne den Admin zu fragen? – Aliens

+0

@ Aliens - Sie müssen den Administrator bitten, das für Sie einzurichten. Da Sie NB verwenden, haben Sie wahrscheinlich eine Datei in Ihrem Projekt $ PROJECT_ROOT/setup/sun-resources.xml. Sie können diese Datei Ihrem Administrator geben und sie bitten, asadmin add-resources http://docs.sun.com/app/docs/doc/821-1758/add-resources-1?l=de&a=view zu verwenden, um sich zu registrieren Ihre Ressourcen. – vkraemer

+0

Ich habe eine Admin-XML-Datei gesendet, die Sie vorgeschlagen haben, und er ist Ihrem Rat gefolgt. Die Verbindung zur Datenbank funktioniert schließlich. Vielen Dank. – Aliens

0

Einige Ideen sind
- log statt Konsole Datei
- Druckprotokoll auf Ihrem Streben Seite
- vielleicht haben Sie keine Zuschüsse oder Firewall-Problem für den Zugriff auf DB

+0

Ich bin mir nicht sicher, ob ich auf die Protokolldateien auf einem Remote-Glassfish-Server zugreifen könnte. Admin gab mir nur die Möglichkeit mein Projekt auf den Server hochzuladen. – Aliens

0

Ich tippe, dass Sie haben keine Berechtigung, auf die DB zuzugreifen ...

Probieren Sie dies als Test ... installieren Sie den MySQL-Client auf einem anderen Rechner und verbinden Sie sich von dort mit dem MySQL-Server.

Wenn das fehlschlägt, dann:

Login Sprich mit: Benutzer: Test Passwort Passwort

Öffnen Sie dann den Mysql-Client und geben Sie ein:

use nameOfDatabase; 
GRANT ALL ON nameofDatabase.* TO 'userName'@'ipaddressOfServerOrDNSName'; 

Das sollte es tun .

Es gibt auch andere Möglichkeiten, den Zugang zu geben, sehen http://dev.mysql.com/doc/refman/5.1/en/grant.html

+0

MySql Client auf meinem Rechner verbindet sich erfolgreich mit einer Datenbank und wählt, aktualisiert, fügt ein. Das Problem tritt nur auf, wenn der MySql-Client auf dem Remote-Server ausgeführt wird. Ich habe versucht, GRANT ALL-Anweisung zu schreiben, aber ich erhalte den Fehlercode 1044, was bedeutet, dass ich keinen Zugriff habe, um irgendwelche Rechte zu ändern. Ich sollte dafür Admin kontaktieren. – Aliens

+0

Beachten Sie den zweiten Teil des GRANT: eine IP-Adresse. Alles, was Ihr Erfolg verspricht, ist, dass Ihrem Rechner wahrscheinlich GRANT-Zugriff gewährt wurde, der Remote-Server jedoch nicht. – duffymo

0

Sind Sie sicher, dass Ihre Datenbank-Setup richtig auf dem Remote-Server ist? Es klingt wie ein Firewall-Problem.

+0

Ich kann von meinen Localhost-Anwendungen auf die Datenbank ohne Probleme zugreifen. Es sollte also nicht die Datenbank sein. – Aliens

0

Leider kann ich nicht von der Serverkonsole lesen.

Wenn Sie Shell-Zugriff auf den Remote-Server haben, ist die Lösung einfach:

  • Ändern Sie die Protokollierung configs so dass Ihre Webapp Protokolle in eine Datei statt/sowie die Konsole.
  • Melden Sie sich an und lesen Sie die Datei.

(Tat, wenn Sie Tomcat verwendet haben, Sachen zu System.out/System.err geschrieben wird ohnehin in eine Datei geschrieben. Vielleicht ist dies für Glassfish auch wahr ist.)

Wenn Sie nicht tun Wenn Sie Shellzugriff haben, müssen Sie möglicherweise Ihre Webanwendung ändern, um eine zusätzliche Seite bereitzustellen, mit der Sie die Protokolldatei von Ihrem Webbrowser herunterladen oder anzeigen können. Wenn Sie darauf zurückgreifen müssen, achten Sie auf die offensichtlichen Sicherheitsbedenken.

0

Das ist mein weg (wilde Augen erraten) ....

Ihr lokaler App-Server hat den MySQL-Treiber installiert. Die JDBC-Ressource ist ebenfalls korrekt definiert. Der MySql-Server läuft wahrscheinlich auf Ihrem lokalen Host. Sie haben Ihre App lokal in NetBeans entwickelt.

Wenn Sie eine App von NetBeans auf einem lokalen Server bereitstellen, stellt die IDE sicher, dass auf dem Server der DB-Treiber installiert ist. NetBeans kann das nicht, wenn Sie auf einem Remote-Host bereitstellen. Wenn Sie eine andere Bereitstellungsmethode verwenden, ist die Treiberinstallation nicht automatisch. Es ist ein leichter Schritt zu vergessen.

Sie können feststellen, ob das MySql-Laufwerk auf Ihrem Server installiert ist, indem Sie eine Webanwendung schreiben, die versucht, eine der Klassen aus der Treiber-JAR-Datei zu laden oder zu verwenden. Wenn der Zugriff eine Ausnahme generiert, können Sie wahrscheinlich etwas erhalten, das funktioniert, indem Sie das MySql-Laufwerk in die WEB-INF/lib Ihrer Webanwendung einbinden.

NetBeans hilft auch Leuten, ihre JDBC-Ressourcendefinitionen zu erstellen und zu verwalten. Wenn Sie eine App erstellen, die auf eine Datenbank auf Ihrem lokalen Host abzielt, hat die JDBC-Ressource localhost als Teil der URL. Dies funktioniert hervorragend, wenn die App auf demselben Server wie der DB-Server bereitgestellt wird. Wenn die App auf einen anderen Server verschoben wird, muss die JDBC-Ressource geändert werden, um zu berücksichtigen, dass sich der DB-Server NICHT auf dem lokalen Host befindet.

Wenn Sie keinen Administratorzugriff auf den Remote-Server haben, können Sie die Ressourcen nicht definieren. Wenn Ihr Remote-Server eine GlassFish 3.1-Domäne/-Instanz ist, können Sie application scoped resources nutzen, um die für Ihre App definierten Ressourcen zu erhalten.

In Bezug auf den Zugriff auf die Protokolldatei.

Wenn Sie asadmin zum Bereitstellen auf dem Remote-Server verwenden, hilft Ihnen dieser Befehl beim Zugriff auf das Serverprotokoll, wenn Sie mit GlassFish v2.x arbeiten: http://docs.sun.com/app/docs/doc/821-0179/display-log-records-1?l=en&a=view. Sie können das Protokoll auch über die Admin-Konsole aufrufen.

Wenn Sie rcp zum Bereitstellen Ihrer App verwenden, indem Sie sie in das Verzeichnis für die automatische Bereitstellung des fernen Servers kopieren, möchten Sie möglicherweise sehen, ob Sie das Protokoll auf Ihren lokalen Computer kopieren können.

Zum Beispiel ... wenn Ihr Admin sagen Ihnen einen FTP-Befehl wie folgt zu implementieren mit:

ftp> cd /a/b/glassfish/domains/domain1/autodeploy 
ftp> put MyGreatWebapp.war 

Sie können in der Lage sein, um das Protokoll zu erhalten, indem Sie so etwas wie dies zu tun:

ftp> cd /a/b/glassfish/domains/domain1/logs 
ftp> get server.log 

Experiment ....

+0

Danke für Ihre Vorschläge. – Aliens