Applet und MySQL - Treiber wird nicht gefunden

stookie

Grünschnabel
Hallo,

ich habe ein Applet, mit dem ich auf eine MySQL-DB zugreifen möchte. Das Applet und die DB liegen auf demselben Server. Allerdings bekomme ich immer die Fehlermeldung: SQLException: No suitable driver SQLState: 08001

Ich programmiere unter Windows XP Professional mit dem jdk1.5.0_04 und verwende den Treiber mysql-connector-java-3.1.10-bin.jar. Mein MySQL-Server hat die Version 4.1.10a-nt, der Server ist ein Apache 1.3.33.

Habe verschiedenes probiert: Die jar-Datei des Connectors in das Verzeichnis kopiert, in dem das Applet gespeichert wird, die jar-Datei entpackt und diese Verzeichnisse in das Appletverzeichnis gespeichert. Habe die Funktion Class.forName() ersetzt durch DriverManager.registerDriver(), leider immer das gleiche Problem.

Anbei der Code des Applets:
Code:
import java.awt.*;
   import javax.swing.*;
   import javax.swing.table.*;
   import java.util.*;
   import java.io.*;
   import java.sql.Connection;
   import java.sql.DriverManager;
   import java.sql.SQLException;
   import java.sql.Statement;
   import java.sql.ResultSet;
   
   /*
    <html>
   <head>
   <title>Diagnosenübersicht</title>
   </head>
   <body>
   <applet 
   		code="Diaguebersicht.class" 
   		archive = "mysql-connector-java-3.1.10-bin.jar"
   		width="950" 
   		height="500">
   </applet>
   </body>
   </html>
    */
   
   
   public class Diaguebersicht extends JApplet
   {
   	 // Variables declaration - do not modify
   	private JButton hinzBtn;
   	private JButton bearbBtn;
   	private JButton delBtn;
   	private JButton ndiagBtn;
   	private JButton upupBtn;
   	private JButton upBtn;
   	private JButton downdownBtn;
   	private JButton downBtn;
   	private JLabel jLabel1;
   	private JLabel jLabel2;
   	private JLabel jLabel3;
   	private JLabel jLabel4;
   	private JLabel jLabel5;
   	private JPanel jPanel1;
   	private JPanel jPanel2;
   	private JPanel jPanel3;
   	private JPanel jPanel4;
   	private JPanel jPanel5;
   	private JPanel jPanel6;
   	private JPanel jPanel7;
   	private JTable table;
   	private DefaultTableModel tableModel;
   	private JScrollPane scrollPane;
   	String treiber = null;
   	// End of variables declaration	
   	
   
   	public void init()
   	{
   		 try 
   		{
   			
   			
   
 			DriverManager.setLogWriter( new PrintWriter(System.out) );
   			
   			
   			Class.forName("com.mysql.jdbc.Driver");
 			//DriverManager.registerDriver(new com.mysql.jdbc.Driver());
 			for (Enumeration e = DriverManager.getDrivers(); e.hasMoreElements();)
   			{
 		 	System.out.println( e.nextElement().getClass().getName());
   			}
   			
   		} 
   		catch (Exception ex) 
   		{
   			// handle the error
 			System.out.println("Treiber konnte nicht geladen werden");
   		}
   	
   		Connection conn = null;
   	
   		try 
   		{
 			conn = DriverManager.getConnection("jdbc:mysql://192.168.0.16:3306/phepa", "stookie", "test123");
   		}
   		catch (SQLException ex) 
   		{
   			// handle any errors
 			System.out.println("SQLException: " + ex.getMessage());
   			System.out.println("SQLState: " + ex.getSQLState());
 			System.out.println("VendorError: " + ex.getErrorCode());
   		}
   		
   		// assume conn is an already created JDBC connection
   		Statement stmt = null;
   		ResultSet rs = null;
   
   		try 
   		{
   			stmt = conn.createStatement();
 			rs = stmt.executeQuery("SELECT localisationside_cd FROM pat_diagnosis");
   		}
   		catch (SQLException ex)
   		{
   			System.out.println(ex);	
   		}
   		finally 
   		{
   			if (rs != null) 
   			{
   				try 
   				{
 					while (rs.next())
 		 		 System.out.println(rs.getString(1));
   				}
   				catch (SQLException sqlEx) 
   				{}
   				
   				rs = null;
   			}
   			if (stmt != null) 
   			{
   				try 
   				{
 					stmt.close();
   				} 
   				catch (SQLException sqlEx) 
   				{}
   				
   				stmt = null;
   			}
   		}
   
   		
   		
   		jPanel1 = new JPanel();
   		jPanel5 = new JPanel();
   		jLabel1 = new JLabel("Stammdaten");
   		jPanel6 = new JPanel();
   		jLabel2 = new JLabel();
   		jLabel4 = new JLabel();
   		jLabel3 = new JLabel();
   		jLabel5 = new JLabel();
   		jPanel7 = new JPanel();
   		tableModel = new DefaultTableModel();
   		jPanel2 = new JPanel();
   		upupBtn = new JButton("S");
   		upBtn = new JButton("O");
   		downdownBtn = new JButton("R");
   		downBtn = new JButton("T");
   		jPanel3 = new JPanel();
   		hinzBtn = new JButton("Hinzufügen");
   		bearbBtn = new JButton("Bearbeiten");
   		delBtn = new JButton("Löschen");
   		jPanel4 = new JPanel();
   		ndiagBtn = new JButton("Nebendiagnose");
   		scrollPane = new JScrollPane();
   	   
   
   		Container contentPane = getContentPane();
   		contentPane.setLayout(new BorderLayout());
   		jPanel1.setLayout(new BorderLayout());
   
   		
   		jPanel5.add(jLabel1);
   
   		jPanel1.add(jPanel5, BorderLayout.NORTH);
   
   		jLabel2.setText("Name");
   		jPanel6.add(jLabel2);
   
   		jLabel4.setText("Straße");
   		jPanel6.add(jLabel4);
   
   		jLabel3.setText("Geburtsdatum");
   		jPanel6.add(jLabel3);
   
   		jLabel5.setText("Ort");
   		jPanel6.add(jLabel5);
   
   		jPanel1.add(jPanel6, BorderLayout.CENTER);
   		jPanel1.add(jPanel7, BorderLayout.SOUTH);
   		contentPane.add(jPanel1, BorderLayout.NORTH);
   		
   		tableModel.addColumn("");
   		tableModel.addColumn("lfd. Nr.");
   		tableModel.addColumn("Diagnosentext");
   		tableModel.addColumn("Lokalisation");
   		tableModel.addColumn("seit");
   		tableModel.addColumn("Sicherheit");
   		tableModel.addColumn("Bezugsart");
   		tableModel.addColumn("zu Diag-Nr.");
   		tableModel.addColumn("ICD");
   		tableModel.addColumn("erfasst am");
   		tableModel.addColumn("durch");
   		tableModel.addColumn("Notiz");
   		
   		Vector reihe = new Vector();
   		   
   		   reihe.add("");
   		reihe.add("1");
   		reihe.add("Testtext");
 		reihe.add("rechts");			
   		reihe.add("August 2005");	
   		reihe.add("Verdacht auf");
   		reihe.add("Folgediagnose");
   		reihe.add("2");
   		reihe.add("XY 23.5");
   		reihe.add("01.08.05");
   		reihe.add("Dr. Erfasser");
   		reihe.add("vorhanden");
   					
   		tableModel.addRow(reihe);
   		
   		table = new JTable();
   		table.setModel(tableModel);
   		scrollPane.add(table);
   		contentPane.add(scrollPane, BorderLayout.CENTER);
   		
   		scrollPane.setViewportView(table);
   		
   		jPanel2.add(upupBtn);
   		jPanel2.add(upBtn);
   		jPanel2.add(downdownBtn);
   		jPanel2.add(downBtn);
   
   		jPanel3.add(hinzBtn);
   		jPanel3.add(bearbBtn);
   		jPanel3.add(delBtn);
   
   		jPanel4.setLayout(new BorderLayout());
   		jPanel4.add(ndiagBtn, BorderLayout.CENTER);
   
   		jPanel2.add(jPanel3);
   		jPanel2.add(jPanel4);
   
   		contentPane.add(jPanel2, BorderLayout.SOUTH);
   	}
   }
Ich weiß, es gibt durchaus elegantere Methoden mit Java webbasiert auf eine DB zuzugreifen, aber leider lautet die Vorgabe, das mit einem Applet zu realisieren.

Danke im Voraus

Gruß

Katrin
 
Hallo!

Du musst innerhalb des applet Tags das archive Tag setzen und dort das passende mysql-connector...jar angeben. Verwende statt dem applet Tag besser den object Tag ->
http://ww2.cs.fsu.edu/~steele/XHTML/appletObject.html
Über den HtmlConverter aus dem bin Verzeichnes deines JDK kannst du applet Tags in object Tags umwandeln lassen.
Weiterhin solltest du statt des alten DriverManagers besser die entsprechende DataSource Implementierung (MysqlDataSource) nutzen. Dann musst du auch die JDBC Treber Klasse nicht mehr von Hand laden.

In der init() Methode:
die createmySQLDataSource() Methode aufrufen und die zurückgegebene DataSource in einer Membervariablen ablegen.
Code:
  	private DataSource createMySqlDataSource() {
  		MysqlDataSource mySqlDataSource = new MysqlDataSource();
  		mySqlDataSource.setUser("root");
  		mySqlDataSource.setPassword("");
  		mySqlDataSource.setServerName("tom.de.tutorials");
  		mySqlDataSource.setPort(3306);
  		mySqlDataSource.setDatabaseName("test");
  		return mySqlDataSource;
  	}
Btw. ich wuerde die Vebrindungsdaten auch nicht direkt im Applet speichern sondern irgendwie anders, z.Bsp. ueber eine gesicherte Verbindung, beschaffen.

Anschließend die start und stop Methoden entsprechend implementieren:
(Connection ebenso in einer Membervariable halten)
Code:
  	public void start() {
  		try {
  			connection = dataSource.getConnection();
  		} catch (SQLException e) {
  			e.printStackTrace();
  		}
  	}
  
  	public void stop() {
  		try {
  			connection.close();
  		} catch (SQLException e) {
  			e.printStackTrace();
  		}
  	}

Weiterhin empfehle ich dir den Applet-Code auch in ein jar auszulagern. Das kannst du dann beispielsweise auch seperat signieren etc. Das "archive" Attribut unterstützt auch mehrere Einträge:
Code:
   			<param name="archive"
   		        value="lib/applet.jar,lib/mysql-connector-java-3.1.8-bin.jar"/>
 			<param name="code" value="de.tutorials.applet.MysqlAppletExample"/>

Gruß Tom
 
Hallo,

erst einmal Danke für die schnelle Antwort. Allerdings hatte ich das archive-Tag schon gesetzt, das steht auch als Kommentar in meinem Code.

Habe den HtmlConverter genutzt und dabei das unten Stehende generiert bekommen. Leider immer noch der selbe Fehler.

Code:
<html>
 <head>
 <title>Diagnosenübersicht</title>
 </head>
 <body>
 <!--"CONVERTED_APPLET"-->
 <!-- HTML CONVERTER -->
 <object
 	classid = "clsid:CAFEEFAC-0015-0000-0004-ABCDEFFEDCBA"
 	codebase = "http://java.sun.com/update/1.5.0/jinstall-1_5_0_04-windows-i586.cab#Version=5,0,40,5"
 	WIDTH = "950" HEIGHT = "500" NAME = "Diagnosenuebersicht" ALIGN = "middle" >
 	<PARAM NAME = CODE VALUE = "Diaguebersicht.class" >
 	<PARAM NAME = ARCHIVE VALUE = "mysql-connector-java-3.1.10-bin.jar" >
 	<PARAM NAME = NAME VALUE = "Diagnosenuebersicht" >
 	<param name = "type" value = "application/x-java-applet;jpi-version=1.5.0_04">
 	<param name = "scriptable" value = "false">
 
 	<comment>
 	<embed
 			type = "application/x-java-applet;jpi-version=1.5.0_04" \
 			CODE = "Diaguebersicht.class" \
 			ARCHIVE = "mysql-connector-java-3.1.10-bin.jar" \
 			NAME = "Diagnosenuebersicht" \
 			WIDTH = "950" \
 			HEIGHT = "500" \
 			ALIGN = "middle"
 		scriptable = false
 		pluginspage = "http://java.sun.com/products/plugin/index.html#download">
 		<noembed>
 			
 			</noembed>
 	</embed>
 	</comment>
 </object>
 
 <!--
 <APPLET CODE = "Diaguebersicht.class"
 ARCHIVE = "mysql-connector-java-3.1.10-bin.jar" WIDTH = "950" HEIGHT = "500" NAME = "Diagnosenuebersicht" ALIGN = "middle">
 
 
 </APPLET>
 -->
 <!--"END_CONVERTED_APPLET"-->
 
 </body>
 </html>

Vielleicht ist es noch interessant zu wissen, dass ich mit "normalen" Java-Programmen ohne Probleme Zugriff auf die DB habe.

Ich hoffe, es gibt noch weitere Vorschläge zur Lösung meines Problems.

Gruß

Katrin
 
hallo,

etwas spaet aber ich habe mich gerade erst mit aehnlichem problem befasst.

zum einen funktioniert der zugriff eigentlich problemlos, wenn du auf dem client-rechner im ext-verzeichnis des jre das jar-file (mysql-connetor) liegen hast und den aufrufe
Code:
Class.forName(<treibername(z.B. mysql-connector-java-3.0.14-production-bin.jar>).newInstance();
benutzt.

da sich das automatisieren der korrekten java-version auf dem clientrechner problemlos realisieren laesst, der download des mysql-connectors aber von hand vorgenommen werden muss habe ich ihn folgendermaßen in mein projekt (entwickelt mti eclipse 3.1) mit eingebunden (eventl. geht es auch einfach/besser!?):

zuerst habe ich die mysql-connector-jar-datei in das projekt mit eingebunden (Project -> Properties -> Java Built Path -> Libraries und jar hinzugefügt).

anschliessend den treiber in der entsprechenden klasse importiert
Code:
import com.mysql.jdbc.Driver;
- und analog deinem code - den drivermanager benutzt
Code:
DriverManager.registerDriver(new Driver());
.

leider wurde so allein die klasse "Driver.class" beim laden des applets nicht gefunden. also habe ich das connector-jar-file entpackt und das komplette verzeichnis com mit in mein projekt uebernommen. mein applet wird bereits in ein bestimmtes jar-archiv gepackt, also habe ich noch das com-verzeichnis mit in mein vorhandenes jar-archiv gepackt und der zugriff funktioniert.

eventl. hilft das ja noch jemanden weiter :)
gruss kobi
 
Zuletzt bearbeitet:
Hallo!

zum einen funktioniert der zugriff eigentlich problemlos, wenn du auf dem client-rechner im ext-verzeichnis des jre das jar-file (mysql-connetor) liegen hast und den aufrufe
man sollte besser keine eigenen jars ins ext Verzeichnis der jre/jdk installation legen, da dass zu ClassLoading Problemen führen kann, wenn unterschiedliche Programme mit der selben JRE instanz arbeiten, diese aber beispielsweise gegen eine "andere" Version dieses in ext liegenden jars gebaut worden sind... mehr dazu weis google.

Btw. so wie du die Datenbankverbindugn aufbauen willst geht das nicht... ich hab meinen Post mal ein wenig aktualisiert.. (siehe oben drüber)

Gruss Tom
 
Hallo,

Thomas Darimont hat gesagt.:
man sollte besser keine eigenen jars ins ext Verzeichnis der jre/jdk installation legen, da dass zu ClassLoading Problemen führen kann, wenn unterschiedliche Programme mit der selben JRE instanz arbeiten, diese aber beispielsweise gegen eine "andere" Version dieses in ext liegenden jars gebaut worden sind... mehr dazu weis google.

mein selbst erstelltes Jar-File liegt natuerlich an einer anderen Stelle, da dort auch noch die File-Zugriffe der Applets ueber Policies gesteuert werden. Ich meinte ausschließlich das JConnector-File von MySQL. Ich dachte das ext-Verzeichnis sei fuer solche Module da!


Thomas Darimont hat gesagt.:
Btw. so wie du die Datenbankverbindugn aufbauen willst geht das nicht... ich hab meinen Post mal ein wenig aktualisiert.. (siehe oben drüber)

hmmm...meinst du den DriverManager.registerDriver(.....)-Aufruf? Ich denke das beim Laden des JConnector-Treibers auch nur dieses Interface genommen wird. Ich muss zugeben, etwas gewundert hat mich das ganze auch, aber es funktioniert hier bei mir wirklich. Wie gesagt, ich habe einfach das JConnector-Treiber-Jar entpackt und mit in mein Projekt mit eingebunden. Ich dachte eigentlich, ich koennte das JConnetor-Jar in mein Eclipse-Projekt so mit einbinden, dass es nicht im JRE eines Client-Rechners liegen muss. Aber meine 0815-Datenbankzugriffe funktionieren ueber die oben beschriebene Methode.

Wenn Du weisst, wie ich das bestehende JConnector-Jar File in mein Projekt mit einbinden kann, ohne das es im JRE eines Clientrechners liegen muss und meine Applets die Klassen finden (btw. mit Classpath zum Jar-File setzen hab ich es nicht hinbekommen) waere ich Dir sehr dankbar.

Gruss und schoene Weinachten
kobi
 

Neue Beiträge

Zurück