Newsgroup: it.comp.java
Titolo: AIUTO URGENTISSIMO !!!!!!!

Salve, ho un problema urgentissimo da risolvere.
Realizzando un'applet banale con un pulsante che se premuto apra una
connessione ad un database e avvisi in frame se c'e' eccezione.
IL db e' un Oracle805, ho usato sia il driver nel Classes111 che quello in
Classes102.
Il codice e' Class.forName("oracle.jdbc.driver.OracleDriver");
                  Connection conn =
DriverManager.getConnection("jdbc:oracle:thin:@10.0.1.35:1521:ana1",user,pas
sword) ;
Mi riporta una SQLException "no suitable Driver" ma la cosa strana e' che da
locale con l'appletviewer dentro il JBuilder2 riesco a connettermi ed
eseguire la query con successo.
Ho trasferito tutti i file nella macchina dove risiede il db ma non si
riesce a fare niente.
La stessa cosa mi accade anche collegandomi al db esempio NORTHWIND sotto
access97 col bridge jdbc-odbc
Mi potete consigliare?
                                            Grazie

Mi pare un problema di ClassPath, cioe', lui sa dove trovarti il file .zip
che contiene il driver di Oracle?
Davide


Il codice e' quello che scrivi, ovvero Class.forName() e nella riga dopo
DriverManager.getConnection(), o c'e' qualche altra istruzione in mezzo? Se fosse la
seconda che ho detto (quelo), allora e' possibile che il GC ti elimini la classe del
driver prima che tu arrivi a richiedere la connessione: ti consiglio o di mantenere un
reference alla classe o all'istanza del driver da qualche parte, o di aprire la
connessione subito dopo avere caricato il driver.
Per esempio, definisiciti nell'applet una variablile statica come questa:
private static Class driverClass;
e nel codice:
driverClass = Class.forName("oracle.jdbc.driver.OracleDriver");
Ciao,
    Bruno.
|
| Bruno Bossola
| A Java Software Engineer :-)
|

 driver prima che tu arrivi a richiedere la connessione: ti consiglio o di mantenere un
l'unico motivo per cui si usa il Class.forName() e' che c'e' un metodo
statico nel driver che inizializza le cose; non viene neanche istanziato
niente, quindi il garbage collector non deve neanche eliminare niente
(elimina le istanze mica le classi)
-- 
Greetings,
Alessandro
Pesaro, Italy



Sbagli, il GC elimina le classi. So bene come funzionanano sia i driver JDBC (ne ho
scritti personalmente un paio) sia il GC: nella 1.1.x, il gc colleziona _anche_ le classi
(non mi pronuncio sulla 1.2). Puoi verificarlo semplicemente lanciando la VM con
-verbosegc e con un piccolo pezzo di codice (che se vuoi ti posso anche fornire :-))
Vedrai che il GC, dopo la forName, se non fai in tempi brevi (beh, definizione euristica
ma comprensibile) una richiesta al DriverManager (classe caricata implicitamente per
risolvere la classe del driver e per poterne registrare l'istanza) ti scarica dalla
memoria tutto il pacco regalo: la tua istanza del driver, la classe del driver, la classe
DriverManager, ecc.ecc.
Questo l'ho verificato personalmente su diversi progetti, piattaforme NT e Unix, JDK 1.1.6
/ 1.1.7


 -verbosegc e con un piccolo pezzo di codice (che se vuoi ti posso anche fornire :-))
Così a titolo di curiosità potresti postarlo? :)
Ciao,
 Stefano
----------
"X WindowSSS, teSSSoro mio... lo odieremo per SSSempre"
Bill Gollum
----------


Okay, io questo codice l'ho provato con diversi driver (oracle thin /
oci, as400 thin / native, bridge jdbc-odbc) e l'unico che "resiste" e'
il bridge jdbc-odbc: probabilmente a causa del fatto di come e' inchio
dato nel sistema :-)
L'uso e' semplice, la situazione "cattiva"/"buona" si controlla con il
primo parametro (TRUE o FALSE) e ad esempio per fare i cattivi con
oracle si lancia in questo modo:
java -verbosegc Test TRUE oracle.jdbc.driver.OracleDriver
jdbc:oracle:thin:@server:1521:SID USR PWD
Fare i cattivi significa infilare un gc() fra il caricamento del driver
e l'ottenimento della connessione.
Ecco l'output:
C:\TEMP>java -verbosegc Test TRUE oracle.jdbc.driver.OracleDriver
jdbc:oracle:thin:@server:1521:SID scott tiger
<GC: need to expand mark bits to cover 32768 bytes>
GC:       true
Driver:   oracle.jdbc.driver.OracleDriver
URL:      jdbc:oracle:thin:@eurotest:1524:omni8i
User:     imivalue
Password: test
Loading driver...
Ok!
Whups! Doing gc :-)...
<GC: compactHeap took 2 ms, blocks_moved=0x950>
<GC: last free block at 0x01002F4C of length 708784>
<GC: last free block is at end>
<GC: freeing class java.lang.Compiler>
<GC: freeing class java.sql.Driver>
<GC: freeing class java.sql.DriverInfo>
<GC: freeing class java.sql.DriverManager>
<GC: freeing class java.util.Vector>
<GC: freeing class oracle.jdbc.driver.OracleDriver>
<GC: unloaded and freed 6 classes>
<GC: freed 408 objects, 11768 bytes in 11 ms, 84% free (709504/838856)>
  <GC: init&scan: 2 ms, scan handles: 1 ms, sweep: 1 ms, compact: 7 ms>
Ok!
Obtaining connection...
java.sql.SQLException: No suitable driver
        at java.sql.DriverManager.getConnection(Compiled Code)
        at java.sql.DriverManager.getConnection(DriverManager.java:126)
        at Test.executeTest(Test.java:40)
        at Test.main(Test.java:110)
Allego il codice.
HTH,
    Bruno.
****************** IL CODICE ***********************
import java.sql.*;
import java.io.PrintWriter;
import java.io.StringWriter;
public class Test
{
	String itsDrv;
	String itsUrl;
	String itsUsr;
	String itsPwd;
	public Test(String drv, String url, String usr, String pwd)
	{
		this.itsDrv = drv;
		this.itsUrl = url;
		this.itsUsr = usr;
		this.itsPwd	= pwd;
	}
	public void loadDriver() throws SQLException
	{
		System.out.println("Loading driver...");
		try {Class.forName(itsDrv);}
		catch (Exception ex)
		{
			ex.printStackTrace();
			throw new SQLException("Unable to load driver");
		}
		System.out.println("Ok!\n");
	}
	public void executeTest() throws SQLException
	{
		// carica il driver JDBC richiesto ed ottiene una
connessione al database
		Connection c=null;
		System.out.println("Obtaining connection...");
		if (itsUsr == null)
			c = DriverManager.getConnection(itsUrl);
		else
			c = DriverManager.getConnection
(itsUrl,itsUsr,itsPwd);
		System.out.println("Ok! Connection: "+c);
		System.out.println();
		// chiude la connesione
		System.out.println("Closing connection...");
		c.close();
		System.out.println("Ok!\n");
	}
	public static void main(String args[])
	{
		// verifica input utente
		String drv = null;
		String url = null;
		String usr = null;
		String pwd = null;
		boolean dogc = false;
		try
		{
			String s = args[0].toLowerCase();
			if (s.equals("true"))
				dogc=true;
			else if (s.equals("false"))
				dogc=false;
			else
				throw new IllegalArgumentException();
			try
			{
				drv = args[1];
				url = args[2];
				usr = args[3];
				pwd = args[4];
			}
			catch (Exception ex) {}
		}
		catch (Exception ex)
		{
			System.out.println("Parametri: <true|false>
[driver] [url] [user] [pass]");
			System.out.println("(il primo parametro indica
se forzare un gc() fra il caricamento del driver e la richiesta della
connessione)");
			System.exit(-1);
		}
		// mostra l'input utente
		System.out.println("GC:       "+dogc);
		System.out.println("Driver:   "+drv);
		System.out.println("URL:      "+url);
		if (usr != null) System.out.println("User:     "+usr);
		if (pwd != null) System.out.println("Password: "+pwd);
		System.out.println();
		try
		{
			// crea un nuovo oggetto di test
			Test t = new Test(drv,url,usr,pwd);
			// carica il driver
			t.loadDriver();
			// okay, forza un gc per simulare la situazione
			if (dogc)
			{
				System.out.println("Whups! Doing gc :-
)...");
				System.gc();
				System.out.println("Ok!\n");
			}
			// esegue la query
			t.executeTest();
		}
		catch (SQLException ex)
		{
			ex.printStackTrace();
		}
	}
}
Sent via Deja.com 
http://www.deja.com/
Before you buy.