Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
folgendes Problem: In einer Applikation soll eine Datenbank (MySQL) angesprochen werden. Ansich ja kein Problem.
Die Applikation soll allerdings auch hinter einer Firewall die die entsprechenden Ports für eine JDBC Verbindung sperrt funktionieren.
Und genau hier liegt auch mein Problem
Gibt es eine Möglichkeit die Verbindung über HTTP durchzuführen? Kennt jemand einen anderen Weg so etwas zu realisieren?
Also es kommt halt darauf an ob du den Server selbst verwaltest und den vollen Zugriff hast oder nicht. Falls Ja dann guck dir doch mal SSH und Port Forwarding an. Das dürfte dir wahrscheinlich sehr helfen.
Die Applikation müsste ja trotzdem funktionieren oder warum sperrst du den Port für die MySQL Datenbank von innen nach aussen?
Ansonsten muss ich sagen du drückst dich ein bisschen zu ungenau aus. Erkläre mal ein bisschen genauer wie das bei dir aussieht.
;-) Wie nett das hier immer mehr das gleiche "Problem" haben ...
MySQL via SSH tunneln ist eine Möglichkeit. Hat man aber keinen SSH Zugriff steht man doof da. So wie ich vor einiger Zeit. Deshalb hab ich mich mal hingesetztund angefangen das Problem zu lösen:
Schau dir mal das an: http://jpmdbc.dev.java.net
Du brauchst auf dem MySQL-Server nur einen Webserver mit PHP, und schon geht's.
Ach ja: Das Ding ist noch in der Entwicklung. Wenn du eine SQL-Exception mit "Method not supported" bekommst dann liegts daran dass ich noch nicht weit genug bin mit der implementierung ;-)
@Waldi:
So wie es aussieht will er eine MySQL-Datenbank benutzen die bei mittlerweile fast jedem Webspave dabei ist. Und diese Datenbanken sind nur via localhost zugänglich.
Ok in Ordnung. Wie wird denn das Problem mit der Firewall gelöst? Im Admin sagen er soll den JDBC Port aufmachen oder via SSH probieren weil das meist automatisch erlaubt ist. Aber so ganz schwarz ohne das das einer Checkt ?? Geht so was??
Aaaaalso...
Erstmal muss man wissen um was für eine Firewall es sich handelt. Firmenfirewalls bzw. Proxys erlauben meist nur Port 80 für surfen und Port 21 für FTP. Hinzu kommt dann oft noch Port 443 für sichere HTTP-Verbindungen (https). Das war's dann erstmal mit offenen Ports für ausgehende Verbindungen.
Port 22 für SSH ist in den wohl seltensten Fällen "automatisch" offen. Wohl gemerkt: Ich spreche jetzt von Firewalls und Proxys wie man sie i.d.R. in Firmen antrifft.
Wenn man durch so ein "Gebilde" auf eine DB zugreifen will, ist man mit SSH meist "aufgeschmissen. Zumal man erstmal einen SSH-Server außerhalb der Firewall haben muss.
Für JDBC gibt es keinen Port. Jede Datenbank wird anders angesprochen. Bei MySQL ist es der Port 3306. Und ob der Admin einem Port 3306 aufmacht ist fraglich (In seinen Augen: weniger offene Ports = besserer Schutz).
Wenn man einen SSH-Server außerhalb der Firewall besitzt und die Firewall oder der Proxy Port 443 für sichere HTTP-Verbindungen zulässt, dann kann man den SSH-Port 22, der ja normalerweise nicht durch so eine Firewall durch geht, auf Port 443 umlegen. Dann kommt man immerhin mal schon auf den SSH. Und damit kann man dann beliebige Ports tunneln und sich auch Port 3306 eines im Internet stehenden MySQL-Servers durch den SSH-Tunnel zu sich hinter die Firewall holen.
So, hat man aber nicht die Möglichkeit des eigenen SSH-Servers und lässt sich der Admin auch nicht überreden einen entsprechenden Port aufzumachen, dann bleibt nur noch der Weg über das was eh schon erlaubt ist: Nämlich ausgehende HTTP-Verbindungen über Port 80.
Und da setzt mein jPMdbc an. Was du brauchst:
Einen Webserver der mind. PHP4 beherrscht und der Zugriff auf die MySQL-Datenbank hat. Auf den Webserver legst du dann ein kleines PHP-Script welches dem Treiber beiliegt. Und jPMdbc, ein JDBC-Treiber, kann dann über dieses Script auf die Datenbank zugreifen.
Der Admin bei uns wird bestimmt keinen Port für mich öffnen, und SSH wär auch schlecht zu realisieren (kein Server).
Ich werde deine Möglichkeit mit dem PHP heut Abend direkt mal ausprobieren!!!
Hey Alex ich bekomm beim ausführen deines Beispiels folgende Meldung:
java.lang.UnsupportedClassVersionError: de/root1/jpmdbc/jdbc/interfaces/IProgressListener (Unsupported major.minor version 49.0)
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:539)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:251)
at java.net.URLClassLoader.access$100(URLClassLoader.java:55)
at java.net.URLClassLoader$1.run(URLClassLoader.java:194)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274)
at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
Exception in thread "main"
folgender Code:
Code:
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Enumeration;
import de.root1.jpmdbc.jdbc.interfaces.IProgressProvider;
import de.root1.jpmdbc.testing.ProgressPrinter;
/**
*
* A Sample for connecting to a MySQL database behind a webserver
*
* @author Copyright (c) 2007 by Alexander Christian
*/
public class DBOverPHP {
public static void main(String[] args) throws SQLException {
// Connection via proxy is possible ...
System.setProperty("http.proxySet", "true");
System.setProperty("proxyHost", "MEIN_Proxy");
System.setProperty("proxyPort", "MEIN_PORT");
System.setProperty("http.proxyUser", ""MEIN_USER");
System.setProperty("http.proxyPassword", "MEIN_PW");
// if we don't use localhost at port 3306 for the db-connection ,
// we can set it here individually
System.setProperty("jpmdbc.dbhost", "myDbHostname");
System.setProperty("jpmdbc.dbport", "3306");
try
{
Class.forName( "de.root1.jpmdbc.Driver" );
// show some jdbc-info
for ( Enumeration e = DriverManager.getDrivers(); e.hasMoreElements(); ){
System.out.println( e.nextElement().getClass().getName() );
}
DriverManager.setLogWriter( new PrintWriter(System.out) );
// Create the connection-object
Connection con = DriverManager.getConnection("jdbc:jpmdbc:http://www.xyz.de:80/jpmdbc.php?MEINE_DB", "MEIN_DB_USER", "MEIN_DB_USER_PW");
// Create a statement
Statement s = con.createStatement();
// Optional: We want to track the current progress
ProgressPrinter progressPrinter = new ProgressPrinter(); // so we need a class that implements de.root1.jpmdbc.jdbc.interfaces.IProgressListener
IProgressProvider progressProvider = (IProgressProvider) s; // then we need the progressprovider
progressProvider.setProgressListener(progressPrinter); // to register our progress-listener
ResultSet rs = s.executeQuery("SELECT * FROM Aktien;"); // make a selection
while(rs.next()){
System.out.println("name="+rs.getString("name")+" security="+rs.getShort("security"));
}
}
catch ( ClassNotFoundException e ) {
e.printStackTrace();
}
}
}
hab deinen Treiber: jPMdbc_0.0.1e.jar runtergeladen und eingebunden sowie das php file auf meinen Server gespielt...
Wie gesagt: Der Treiber ist noch nicht fertig. Aber die Grundsätzlichen Dinge gehen schon. Prepared Statements bereite ich gerade vor (*g* ein Wortspiel ;-) ).
Wenn du Fragen hast: Benutz doch am besten das Forum (Discussion forums) auf der jPMdbc Projektseite.
Der Treiber ist mit Lesser GPL lizensiert. D.h. du darfst den Treiber als Bibliothek linken. Solltest du den Treiber-Quellcode als festen Bestandteil deines Programms/JARs machen, dann musst du dein Programm auch zu LGPL oder GPL machen.
P.S. Dass man Java 5 brauchst steht auch auf der Projektseite ;-)
P.P.S. Ach ja: Immer mal wieder reinschauen und die neue Version ziehen. Das Ding ist ja noch nicht bug-frei
Hey Alex ich bekomm beim ausführen deines Beispiels folgende Meldung:
java.lang.UnsupportedClassVersionError: de/root1/jpmdbc/jdbc/interfaces/IProgressListener (Unsupported major.minor version 49.0)
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:539)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:251)
at java.net.URLClassLoader.access$100(URLClassLoader.java:55)
at java.net.URLClassLoader$1.run(URLClassLoader.java:194)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274)
at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
Exception in thread "main"
folgender Code:
Code:
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Enumeration;
import de.root1.jpmdbc.jdbc.interfaces.IProgressProvider;
import de.root1.jpmdbc.testing.ProgressPrinter;
/**
*
* A Sample for connecting to a MySQL database behind a webserver
*
* @author Copyright (c) 2007 by Alexander Christian
*/
public class DBOverPHP {
public static void main(String[] args) throws SQLException {
// Connection via proxy is possible ...
System.setProperty("http.proxySet", "true");
System.setProperty("proxyHost", "MEIN_Proxy");
System.setProperty("proxyPort", "MEIN_PORT");
System.setProperty("http.proxyUser", ""MEIN_USER");
System.setProperty("http.proxyPassword", "MEIN_PW");
// if we don't use localhost at port 3306 for the db-connection ,
// we can set it here individually
System.setProperty("jpmdbc.dbhost", "myDbHostname");
System.setProperty("jpmdbc.dbport", "3306");
try
{
Class.forName( "de.root1.jpmdbc.Driver" );
// show some jdbc-info
for ( Enumeration e = DriverManager.getDrivers(); e.hasMoreElements(); ){
System.out.println( e.nextElement().getClass().getName() );
}
DriverManager.setLogWriter( new PrintWriter(System.out) );
// Create the connection-object
Connection con = DriverManager.getConnection("jdbc:jpmdbc:http://www.xyz.de:80/jpmdbc.php?MEINE_DB", "MEIN_DB_USER", "MEIN_DB_USER_PW");
// Create a statement
Statement s = con.createStatement();
// Optional: We want to track the current progress
ProgressPrinter progressPrinter = new ProgressPrinter(); // so we need a class that implements de.root1.jpmdbc.jdbc.interfaces.IProgressListener
IProgressProvider progressProvider = (IProgressProvider) s; // then we need the progressprovider
progressProvider.setProgressListener(progressPrinter); // to register our progress-listener
ResultSet rs = s.executeQuery("SELECT * FROM Aktien;"); // make a selection
while(rs.next()){
System.out.println("name="+rs.getString("name")+" security="+rs.getShort("security"));
}
}
catch ( ClassNotFoundException e ) {
e.printStackTrace();
}
}
}
hab deinen Treiber: jPMdbc_0.0.1e.jar runtergeladen und eingebunden sowie das php file auf meinen Server gespielt...
a) Du brauchst Java 1.5 und nix anderes (der Treiber ist mit Java 5 compiliert).
b) Nimm eine neuere Version. Diese findest du auf https://jpmdbc.dev.java.net/servlets/ProjectDocumentList (nimm die Datei ganz unten mit dem aktuellsten Datum). Für ältere Versionen gibts keinen Support!
c) Warum quotest du dich selbst?