Advanced   Java   Services Verbindungsaufbau über ein DataSourceObjekt Back Next Up Home


DataSource

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.


Verbindungsaufbau mit einem DataSourceobjekt

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().


Ein Namensdienst liefert das DataSourceobjekt

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.


Einrichten eines Namensdienstes
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

Ein DataSourceobjekt von einem Namensdienst abholen
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
Valid XHTML 1.0 Strict top Back Next Up Home