JNDI

Для подсоединения к БД с помощью JNDI-интерфейса используются два класса:

  1. com.relx.jdbc.LinterJNDIDataSource (com.relx.jdbc.jndi.LinterDataSource для jdbc2, jdbc.LinJdbc.jndi.LinterDataSource для jdbc1) – реализация javax.sql.DataSource интерфейса, предназначенного для создания соединения с СУБД;

  2. com.relx.jdbc.LinterJNDIDataSourceFactory (com.relx.jdbc.jndi.LinterDataSourceFactory для jdbc2, jdbc.LinJdbc.jndi.LinterDataSourceFactory для jdbc1) – реализация интерфейса javax.naming.spi.ObjectFactory, предназначенного для создания DataSource объекта по его ранее сохраненным в контекст свойствам.

Класс LinterDataSource устанавливает следующие свойства:

  • url – строка для соединения с СУБД;

  • username – имя пользователя;

  • password – пароль пользователя;

  • description – вспомогательное текстовое описание источника данных;

  • serverName – сетевое имя сервера;

  • databaseName – имя БД на сервере;

  • portNumber – номер порта сервера;

  • encoding – кодировка соединения с сервером.

Каждое из свойств имеет соответствующий get/set метод, названый с учетом соглашений, принятых при написании JavaBeans.

Для соединения с СУБД с помощью JNDI-интерфейса сначала в некотором контексте (в терминах JNDI) создается описание источника данных и его свойств (это выполняется, как правило, однократно при конфигурировании приложения). Затем приложение может многократно получать из контекста источник данных и создавать соединение к этому источнику данных.

Примеры

  1. Программное создание источника данных и привязка его к определенному имени в JNDI-контексте:

    import com.relx.jdbc.LinterJNDIDataSource; // для версии JDK 1.4 и выше
    ...
       LinterDataSource ds = new LinterDataSource();
       ds.setUser("SYSTEM");
       ds.setPassword("MANAGER8");
       ds.setServerName("localhost");
       ds.setPortNumber(1070);
       ds.setDatabaseName("DEMO");
    
       Context ctx = new InitialContext();
       ctx.bind("jdbc/DemoDB", ds);
    ...
  2. Подсоединение к БД c использованием только текстового имени источника данных, помещенного в JNDI-контекст:

      Connection getMyLinterConnection()
        throws NamingException, SQLException
      {
        Context ctx = new InitialContext();
        DataSource ds = (DataSource) ctx.lookup("jdbc/DemoDB");
        Connection conn = ds.getConnection();
        return conn;
      }
  3. Пример конфигурирования источника данных Tomcat для соединения с СУБД:

    1. скопировать файлы linjdbc-1.x.jar в каталог $TOMCAT_HOME/common/lib;

    2. в файле $TOMCAT_HOME/conf/server.xml или в файле приложения META-INF/context.xml в теге < Context > прописать источник данных:

          < Resource name="jdbc/DB"
                    auth="Container"
                    type="com.relx.jdbc.LinterJNDIDataSource"
                    factory="com.relx.jdbc.jndi.LinterDataSourceFactory"
                    user="SYSTEM"
                    password="MANAGER8"
                    url="jdbc:linter:linapid:localhost:1070:local"
                    encoding="cp866"/ >
    3. если сервер JDBC запущен на UNIX-машине, установить encoding="koi8-r";

    4. добавить в WEB-INF/web.xml ссылку на ресурс:

          < resource-ref >
              < res-ref-name >jdbc/DB< /res-ref-name >
              < res-type >com.relx.jdbc.LinterJNDIDataSource< /res-type >
              < res-auth >Container< /res-auth >
          < /resource-ref >
    5. теперь в jsp или сервлетах можно использовать источник данных "jdbc/DB":

      • в сервлете:

        ctx = new InitialContext();
        DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/DB");
        Connection conn = ds.getConnection( );
        Statement stmt = conn.createStatement();
        ...
      • в jsp:

        < %@ page contentType="text/html;charset=UTF-8" language="java" % >
        < %@ taglib prefix="c" uri="http://java.sun.com/jstl/core" % >
        < %@ taglib prefix="sql" uri="http://java.sun.com/jstl/sql" % >
        < sql:query var="autoList" dataSource="jdbc/DB" >
        SELECT * FROM AUTO
        < /sql:query >

Примечание

Для использования JNDI-интерфейса со старыми JDK, не имеющими встроенной поддержки DataSource интерфейса, необходимо вручную установить соответствующие пакеты.

Для указания кодировки символов, использующейся на сервере, в JNDI-интерфейс добавлено свойство encoding.

Для использования нового свойства, например, совместно с tomcat, необходимо:

  1. положить файлы linjdbc-1.x.jar в $TOMCAT_HOME/common/lib;

  2. в файле $TOMCAT_HOME/conf/server.xml или в файле приложения META-INF/context.xml в теге < Context > прописать источник данных:

    < Resource name="jdbc/DB"
             auth="Container"
             type="com.relx.jdbc.LinterJNDIDataSource"
             factory="com.relx.jdbc.LinterJNDIDataSourceFactory"
             user="SYSTEM"
             password="MANAGER8"
             url="jdbc:linter:linapid:localhost:1070:local"
             encoding="cp866"/ >
  3. если linapid запущен на UNIX-машине, установить encoding="koi8-r";

  4. добавить в WEB-INF/web.xml ссылку на ресурс:

    < resource-ref >
          < res-ref-name >jdbc/DB< /res-ref-name >
          < res-type >com.relx.jdbc.LinterJNDIDataSource< /res-type >
          < res-auth >Container< /res-auth >
     < /resource-ref >
  5. теперь в jsp или сервлетах можно использовать источник данных "jdbc/DB":

    • в сервлете:

      Context ctx = new InitialContext( );
      DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/DB");
      Connection conn = ds.getConnection( );
      ..
    • в jsp:

      < %@ page contentType="text/html;charset=UTF-8" language="java" % >
      < %@ taglib prefix="c" uri="http://java.sun.com/jstl/core" % >
      < %@ taglib prefix="sql" uri="http://java.sun.com/jstl/sql" % >
      < sql:query var="autoList" dataSource="jdbc/DB" >SELECT * FROM AUTO< /sql:query >