www.fatihkabakci.com

Personal Website and Computer Science TUR EN

JAVA JNDI

Last update: 7/2/2015 1:54:00 AM

Yazan:Fatih KABAKCI

Bu yazının amacı Java standardı içerisinde yer alan JNDI konusunun ne olduğunu ve nasıl kullanıldığını açıklamaktır.

JNDI (Java Naming Directory Interface - Java Adlandırma Dizin Arabirimi), dağıtık uygulamalarda, nesne kullanımını bir adlandırma ifadesi ile karşılayan bir arabirimdir. JNDI' ın çalışma mantığına çok yakın bir sistem DNS(Domain Name System - Alan Adı Sistemi) dir. Bilindiği üzere bir DNS sistemi alan adlarını IP adresleri ile ilişkilendirilerek hizmet sağlar. Örneğin siz taracıyınıza www.google.com yazdığınızda, DNS bu adrese uygun 216.58.208.100 ip adresine bularak sizi google' a yönlendirir. Burada siz google' ın fiziksel ip adresini bilme zorunluluğuna sahip değilsinizdir. Yalnızca google kelimesini host adı olarak yazarak siteye erişirsiniz.

Bir başka örnekte, nasıl oluşturacağınızı bilmediğiniz bir nesneyi kullanmak istediğiniz durumlar verilebilir. Yine JNDI ile nesnenin sadece adını yazarak onu elde eder ve kullanabilirsiniz. Yazının ilerleyen ayrımında da gösterileceği üzere, bir veritabanı bağlantısına yalnızca bir bağlantı ismi vererek JDBC konfigürasyonlarını her defasında kod üzerinden yapmadan veritabanına kolaylıkla bağlanabilirsiniz. JNDI bir nesne adı alarak, size sadece kullanmak istediğiniz nesneyi verir.

Adlandırma Servisleri (Naming Services)

JNDI standardına benzer şekilde aşağıda hali hazırda bilinen bazı adlandırma servisleri mevcuttur.

COS(Common Object Services - Ortak Nesne Servisleri), CORBA uygulamaları için CORBA nesnelerine erişen ve onları muhafaza etmek için hizmet veren bir adlandırma servisidir.

DNS (Domain Name System - Alan Adı Adlandırma Sistemi), DNS Internetin adlandırma servisidir. Noktalı IP adreslerini insan tarafından okunabilir kelimeler ile ifade edebilen bir sistemi oluşturur.

LDAP(Lightweight Directory Access Protocol - Basit Dizin Erişim Protokolü), Michigan üniversitesi tarafından geliştirilmiş, ağ(network) üzerindeki dizinlere erişmek için kullanılan bir adlandırma servisidir.

NIS(Network Information Service - Ağ Bilgi Servisi), Sun şirketi tarafından geliştirilmiş, basitçe bir kullanıcı adı ve şifre ile ağ üzerindeki dizinlere erişmek için kullanılan bir adlandırma servisidir.

Ancak JNDI' ın yukarıdaki adlandırma servislerinden farkı, adlandırma servisinin isimlendirme biçimidir. JNDI uygulama bağımsız bir çözüm sunar. Bunu kendi içerisinde barındırdığı alt ve yardımcı sınıflar yardımıyla yapar.

Temel Metotlar

void bind(String name, Object object): nesneyi ilk parametre adıyla bağlar.

void rebind(String name, Object object): hali hazırda bir isme bağlı olan nesneyi başka bir isme yeniden bağlar.

Object lookup(String name): belirlenen adlandırma servisinin hizmet verdiği nesneyi döndürür.

void unbind(String name): adlandırma servisini nesneden kaldırır.

void rename(String oldname, String newname): bir nesnenin adlandırma servisi adını değiştirir.

NamingEnumeration listBindings(String name): belirlenen parametreye bağlı adlandırma servislerinin adlarını ve nesneleri bir Enumeration biçiminde döndürür.

NamingEnumeration list(String name): belirlenen parametreye bağlı adlandırma servislerinin adlarını ve nesneleri bir NameClassPair nesneleri içerek şekilde Enumeration biçiminde döndürür. NameClassPair nesneleri yine adlandırma servislerinin adı ve nesnelerini içerir.

Bir JNDI uygulaması için adlandırma servis sağlayıcıya ihtiyacınız vardır. JNDI hakkında daha fazla bilgi almak için http://www.nyu.edu/classes/jcf/g22.3033-007_sp01/handouts/g22_3033_h83.htm yazısından yararlanabilirsiniz.

Konuyu daha iyi anlamak adına kullanışlı olan aşağıdaki örneği inceleyelim.

Aşağıdaki örnekte bir veritabanı bağlantısının JNDI üzerinden gerçekleştirilmesi anlatılmaktadır. Klasik JDBC veritabanı işlemlerinde, kullanıcı adı, şifre ve veritabanı bağlantı bilgileri kaynak kodları üzerinde yer alır. Ancak aşağıdaki örneğin kullanışlı yanı, veritabanı bağlantı bilgilerinin bir config dosyasında yer vererek, kaynak kod tarafında bu bilgiyi tek bir string üzerinden kullanmasıdır. Böylelikle daha sade ve kullanıcı kimliğini gizleyen bir yapı ortaya çıkar. Bir veritabanı bağlantı servisine bir kelime bağlanarak, kolay bir şekilde bağlantı yaratılabilir. Bu örneğin Microsoft .Net tarafındaki karşılığı esasen ConnectionString ifadeleridir.

Aşağıdaki örnek Apache Tomcat sunucusu üzerinde gerçeklenmiştir. Kullanılan örnek veritabanı ise Sql Server için örnek olan AdventureWorksDW2008R2 veritabanıdır. Ancak siz farklı bir veritabanı üreticisi ve veritabanını tercih edebilirsiniz. Tanımlanan JDBC sürücü tipleri hariç hiç bir şey değişmez.

İlk olarak Tomcat' in kurulu olduğu dizin içerisinde \conf\server.xml dosyasına aşağıdaki veritabanı bağlantı bilgilerini ekleyin.

 <GlobalNamingResources>
    
    <Resource auth="Container" driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" name="jdbc/MyDB" global="jdbc/MyDB" maxActive="100" 
    maxIdle="20" minIdle="5" maxWait="10000"  type="javax.sql.DataSource" url="jdbc:sqlserver://localhost:1433;databaseName=AdventureWorksDW2008R2;" 
    username="fatih" password="1234"/>
    
  </GlobalNamingResources>

Yukarıdaki kaynak, veritabanı bağlantı bilgilerini sarmalar. Bu kaynağı yine \conf\context.xml içerisinde tanımlanan bir referans ile kullanmalısınız. Bunun için aşağıdaki ifadeleri \conf\context.xml xml dosyasına ekleyin.

<Context>
   <ResourceLink name="jdbc/MyDB" global="jdbc/MyDB" auth="Container" type="javax.sql.DataSource" />
</Context>

Yukarıdaki ifadeler ile artık Tomcat ortamında bir bağlam(context) oluşturulabilir. Bunun için aşağıda verilen DataSourceServlet.java sınıfını inceleyelim.

package com.fatihkabakci;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

/**
 * Servlet implementation class DataSourceServlet
 * 
 * @author www.fatihkabakci.com
 */
@WebServlet("/DataSourceServlet")
public class DataSourceServlet extends HttpServlet {
   private static final long serialVersionUID = 1L;

   protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      Context ctx = null;
      Connection con = null;
      Statement stmt = null;
      ResultSet rs = null;
      try {

         ctx = new InitialContext();
         DataSource ds = (DataSource) ctx.lookup("java:/comp/env/jdbc/MyDB");

         con = ds.getConnection();
         stmt = con.createStatement();
         rs = stmt.executeQuery("select TOP 10 [FirstName], [LastName] from DimCustomer");

         PrintWriter out = response.getWriter();
         response.setContentType("text/html");
         out.print("<html><body><h2>Customer Details</h2>");
         out.print("<table border=\"1\" cellspacing=10 cellpadding=5>");
         out.print("<th>FirstName</th>");
         out.print("<th>LastName</th>");

         while (rs.next()) {
            out.print("<tr>");
            out.print("<td>" + rs.getString("FirstName") + "</td>");
            out.print("<td>" + rs.getString("LastName") + "</td>");
            out.print("</tr>");
         }
         out.print("</table></body><br/>");

         out.print("</html>");
      }
      catch (NamingException e) {
         e.printStackTrace();
      }
      catch (SQLException e) {
         e.printStackTrace();
      }
      finally {
         try {
            rs.close();
            stmt.close();
            con.close();
            ctx.close();
         }
         catch (SQLException e) {
            System.out.println("Exception in closing DB resources");
         }
         catch (NamingException e) {
            System.out.println("Exception in closing Context");
         }
      }
   }
}

DataSourceServlet.java sınıfı basitçe AdventureWorksDW2008R2 veritabanının DimCustomer tablosundaki ilk 10 müşteri kaydını çekerek tarayıcı ekranında gösterir. Bunun için öncelikle JNDI context oluşturarak, context.xml dosyasındaki kaynak bağlantısına jdbc/MyDB adlı bir adlandırma servisi oluşturur. Yani jdbc/MyDB bundan sonra kısaca bir veritabanı bağlantısı servisi verecektir. Bu önemlidir zira veritabanı bağlantısı bir JNDI adlandırma servisi altında bir string ile ifade edilir. DataSourceServlet ardından veri okuma ve görüntüleme işlemi yaparak tüm kaynakları kapatır.

Özetle JNDI, tüm java programlarında, nesnelere bir takım adlandırma servislere vererek onlara basitçe erişmeye çalışır. Bu bazı nesnelerin nasıl oluşturacağınızı bilmediğiniz durumlarda oldukça yarar sağlar.

There has been no comment yet

Name:


Question/Comment
   Please verify the image




The Topics in Computer Science

Search this site for





 

Software & Algorithms

icon

In mathematics and computer science, an algorithm is a step-by-step procedure for calculations. Algorithms are used for calculation, data processing, and automated reasoning.

Programming Languages

icon

A programming language is a formal constructed language designed to communicate instructions to a machine, particularly a computer. It can be used to create programs to control the behavior of a machine. Java,C, C++,C#

Database

icon

A database is an organized collection of data. The data are typically organized to model aspects of reality in a way that supports processes requiring information.

Hardware

icon

Computer hardware is the collection of physical elements that constitutes a computer system. Computer hardware refers to the physical parts or components of a computer such as the monitor, memory, cpu.

Web Technologies

icon

Web development is a broad term for the work involved in developing a web site for the Internet or an intranet. Html,Css,JavaScript,ASP.Net,PHP are one of the most popular technologies. J2EE,Spring Boot, Servlet, JSP,JSF, ASP

Mobile Technologies

icon

Mobile application development is the process by which application software is developed for low-power handheld devices, such as personal digital assistants, enterprise digital assistants or mobile phones. J2ME

Network

icon

A computer network or data network is a telecommunications network that allows computers to exchange data. In computer networks, networked computing devices pass data to each other along data connections.

Operating Systems

icon

An operating system is software that manages computer hardware and software resources and provides common services for computer programs. The OS is an essential component of the system software in a computer system. Linux,Windows

Computer Science

icon

Computer science is the scientific and practical approach to computation and its applications.A computer scientist specializes in the theory of computation and the design of computational systems.