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 запущен в ОС Linux, установить 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 запущен в ОС Linux, установить 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​>