Advanced Java Services | Verbindungsaufbau über ein DataSourceObjekt |
Sind Treiber geladen, so werden sie von der Klasse DriverManager registriert. Ab Java 1.4 gibt es eine weitere Möglichkeit eine Verbindung zu einer Datenbank aufzubauen. Im Package javax.sql befindet sich Das Interface DataSource. MySQl hat dieses Interfaces in der Klasse com.mysql.jdbc.jdbc2.optional.MysqlDataSource implementiert. Die Klasse ist Standardtreiberpaket enthalten.
Das folgende kleine Programm demonstriert das Vorgehen.
import java.sql.Connection; import javax.sql.DataSource; import java.sql.SQLException; import com.mysql.jdbc.jdbc2.optional.MysqlDataSource; public class DataSourceDemo1 { public static void main(String args[]) { String server = "localhost"; int port = 3306; String databaseName = "test"; String username = "xxx"; String password = "xxx"; try { MysqlDataSource dataSource = new MysqlDataSource(); if( dataSource instanceof DataSource) System.out.println("MysqlDataSource implements the javax.sql.DataSource interface"); System.out.println("datasource created"); dataSource.setServerName(server); dataSource.setPort(port); dataSource.setDatabaseName(databaseName); dataSource.setUser(username); dataSource.setPassword(password); Connection con = dataSource.getConnection(); System.out.println("Connection established"); con.close(); System.out.println("Connection closed"); } catch(SQLException ex) { System.out.println(ex); } } // end main } // end class
Man legt also ein ein Objekt vom Typ MysqlDataSource an, konfiguriert es und ruft dann die Methode getConnection().
Obiges Vorgehen stellt in gewisser Weise eine Ausnahme dar, denn ein DataSourceobjekt wird üblicherweise von einem
Namensdienst geliefert. Um zu demonstrieren, wie man ein Datasourceobjekt von einem Namensdienst erhält basteln wir
uns einen kleinen Nameserver, der uns das gewünschte Objekt liefern kann. Mit Hilfe der Klasse LocateRegistry ist
das sehr einfach.
Hier zunächst das Programm, das einen Namensdienst einrichtet.
import java.util.Properties; import javax.naming.Context; import java.rmi.RemoteException; import javax.naming.InitialContext; import javax.naming.NamingException; import java.rmi.registry.LocateRegistry; import com.mysql.jdbc.jdbc2.optional.MysqlDataSource; public class DataSourceServer { public static void main(String args[]) { try { // rmiregistry (namensserver) einrichten int port = 1099 ; LocateRegistry.createRegistry(port); System.out.println("Nameserver started"); // Creates and exports a Registry on the local host that accepts // requests on the specified port (wirft java.rmi.RemoteException) Properties env = new Properties(); env.put("java.naming.factory.initial", "com.sun.jndi.rmi.registry.RegistryContextFactory"); env.put("java.naming.provider.url", "rmi://localhost:"+port); // für den Defaultport 1099 ist die letzte Zeile nicht notwendig // zu liefernde Datasource konfigurieren MysqlDataSource dataSource = new MysqlDataSource(); String server = "localhost"; int mySqlPort = 3306; // mysql default port dataSource.setServerName(server); dataSource.setPort(mySqlPort); // JNDI naming (setzen eines name,value-paares) Context initialNamingContext = new InitialContext(env); // wirft NamingException initialNamingContext.bind("MySQLDataSource", dataSource); System.out.println("context created, naming completed"); // wirft NamingException } catch(Exception ex) { System.out.println("Exception happened:"); ex.printStackTrace(); } } // end main } // end class
import java.sql.Connection; import java.util.Properties; import java.sql.SQLException; import java.rmi.RemoteException; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.rmi.PortableRemoteObject; import com.mysql.jdbc.jdbc2.optional.MysqlDataSource; public class MySqlDataSourceClient { public static void main(String[] args) { try { int port = 1099 ; String url = "rmi://localhost:"+port ; String jndiName = "MySQLDataSource"; Properties env = new Properties(); env.put("java.naming.factory.initial", "com.sun.jndi.rmi.registry.RegistryContextFactory"); env.put("java.naming.provider.url", url); Context initial = new InitialContext(env); // NamingException Object ref = initial.lookup(jndiName); // NamingException System.out.println("ref = " + ref.getClass().getName() ); MysqlDataSource dataSource = (MysqlDataSource)PortableRemoteObject.narrow(ref, MysqlDataSource.class); System.out.println("datasource received"); System.out.println("DataSource = " + dataSource.getClass().getName() ); String databaseName = "test"; String username = "xxx"; String password = "xxx"; dataSource.setDatabaseName(databaseName); dataSource.setUser(username); dataSource.setPassword(password); Connection con = dataSource.getConnection(); // SQLException System.out.println("Connection established"); con.close(); System.out.println("Connection closed"); } catch(NamingException ex) { System.out.println("Exception happened:"); ex.printStackTrace(); } catch(SQLException ex) { System.out.println("Exception happened:"); ex.printStackTrace(); } } // end main } // end class