Newsgroup: it.comp.java
Titolo: connessione a mysql senza usare TCP/IP: come si fa?

In un programma java devo creare una connessione ad un database mysql 
con il
seguente codice:
//**************** inizio codice ****************
private static Connection con;
static
    {
     try
      {Class.forName("com.mysql.jdbc.Driver").newInstance();}
     //Class.forName("org.gjt.mm.mysql.Driver").newInstance();
     catch (Exception ex)
      {System.out.println("Classe non trovata: "+ex);}
     try
      {
con=DriverManager.getConnection("jdbc:mysql://localhost/nomeDatabase","nomeUtente","password");
       System.out.println("Creata connessione col database");
      }
     catch(SQLException e)
      {
       e.printStackTrace();
       System.out.println("Impossibile accedere al database");
      }
    }
//***************** fine codice *****************
  ...e, fin qui, tutto a posto. Oggi, però, in mysql, ho voluto attivare
l'opzione "Disable networking; Don't allow connection via TCP/IP" (uso
/usr/bin/mysql-administrator). Mi sembra preferibile, per motivi di
sicurezza, disabilitare l'accesso al database dall'esterno se gli unici
programmi che devono utilizzarlo girano sulla stessa macchina dove è
presente il database. Tuttavia, disabilitando il collegamento al
database tramite TCP/IP il codice di cui sopra genera immancabilmente la
seguente eccezione:
** BEGIN NESTED EXCEPTION **
java.net.SocketException
MESSAGE: java.net.ConnectException: Connection refused
STACKTRACE:
java.net.SocketException: java.net.ConnectException: Connection refused
         at
com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:156)
         at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:283)
         at com.mysql.jdbc.Connection.createNewIO(Connection.java:2541)
         at com.mysql.jdbc.Connection.<init>(Connection.java:1474)
         at
com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:264)
         at java.sql.DriverManager.getConnection(DriverManager.java:582)
         at java.sql.DriverManager.getConnection(DriverManager.java:185)
         at test.<clinit>(test.java:43)
** END NESTED EXCEPTION **
E' possibile, in qualche modo, utilizzare i driver per java senza
permettere l'accesso dall'esterno?

 disabilitare l'accesso al database dall'esterno
In molti dbms, e MySql č fra questi, puoi scegliere da quali IP o classi di
IP consentire o negare la connessione. Procurati un front end grafico ed č
immediato impostarlo.


-
Togli .xyz dalla mia email per contattarmi.
Remove .xyz from my address in order to contact me.
-
GPG Key Fingerprint (Key ID = FE068F3E):
5C77 9DC3 BD5B 3A28 E7BC 921A 0255 42AA FE06 8F3E 

 immediato impostarlo.
E' esattamente quello che ho fatto (con /usr/sbin/mysql-administrator ho 
disabilitato l'accesso al database mediante TCP/IP, ma cosě il driver 
java per mysql genera un'eccezione che impedisce la connessione al database.

> - configurazione di mysql perché accetti connessioni solo da localhost.
Questo è esattamente quello che ho fatto, ma in questa modalità il 
driver java non mi fa più connettere al database...


In realtà quello che hai fatto non è disabilitare l'accesso da
localhost ma da *qualsiasi* connessione TCP/IP. In questa modalità
MySql accetta connessioni in altro modo, che purtroppo non ho mai
sperimentato:
- embedded (stesso processo);
- named pipe (Windows NT/2000/XP)
- altro ? (unix/linux)
Prova a vedere sul manuale che ti dice.
Dimitri
--
www.megadix.it

 java per mysql genera un'eccezione che impedisce la connessione al database.
No, non è quello che hai fatto. :-)
Manuel T ti ha detto di abilitare solo le connessioni dalla rete
locale e di togliere quelle provenienti da tutte le altre reti.
Ciao,
   Fabrizio
=== 
http://www.negusweb.it
 ===

 driver java non mi fa più connettere al database...
Se non vuoi usare lo stack TCP, da java la vedo dura connettersi al
database... Non conosco i driver JDBC di MySql, ma per fare quello che
dici tu, credo dovresti verificare un paio di cose:
1) i driver JDBC che usi sono fatti solo di librerie java (uno o più
.jar) o comprendono anche librerie native per vari sistemi operativi?
(.dll oppure .so)
2) esiste una sintassi JDBC del driver MySql che consenta di non
specificare indirizzi e porte?
Per la prima domanda, se le librerie che usi sono fatte di .jar e
basta, la risposta è "no, non puoi usare trasporti diversi da TCP".
Questo perchè per usare named pipes / unix sockets ti devi rivolgere
direttamente al sistema operativo ospitante (di cui non hai visibilità
dall'interno di java, o almeno non dovresti averne). Un'eccezione è
rappresentata dai file mappati in memoria: in java è possibile tramite
il package java.nio, ma finora non ho ancora visto nessuno che abbia
fatto comunicare un processo nativo e un processo java tramite questo
sistema.
Per la seconda domanda: il fatto di utilizzare "localhost" nell'url
JDBC significa che stai andando sempre su socket TCP (o UDP), e quindi
passi ancora dal layer di networking. Guarda la documentazione del
driver, verifica quali sintassi hai a disposizione.
Hope That Helps
-- 
Scientology: se la conosci la eviti, se la conosci non ti uccide...
http://xenu.com-it.net
 - 
http://xenu.freewinds.cx
 - 
http://www.xenu.net
(per rispondere personalmente leva IlDitoDalCulo)
---> 09 F9 11 02 9D 74 E3 5B D8 41 56 C5 63 56 88 C0 <---

 locale e di togliere quelle provenienti da tutte le altre reti.
Allora non so proprio come fare... il front end grafico che uso non mi 
dà altre possibilità... o abilito il TCP/IP, o lo disabilito.

Marco wrote:

Hai due possibilita':
- Configuri il firewall in modo da accettare connessioni a MySQL solo 
dalla macchina locale
- Meglio: Configuri MySQL in modo da "ascoltare" solo su 127.0.0.1. Se 
il tuo frontend grafico non lo permette, cerca il file di configurazione 
di MySQL (my.cnf) e setta la variabile "bind-address = 127.0.0.1"

 > Configuri MySQL in modo da "ascoltare" solo su 127.0.0.1.
 > Cerca il file my.cnf,
 > e setta la variabile "bind-address = 127.0.0.1"
Grazie mille, mi sembra proprio quello che cercavo di fare.
Marco