Использование JNDI для доступа к источнику данных (Tomcat 6) - PullRequest
1 голос
/ 24 сентября 2010

Я пытался настроить пул соединений с базой данных для моего тестового веб-приложения, просто чтобы узнать, как это делается на самом деле. Мне удалось подключить объект DataSource к моей базе данных, который теперь предоставляет мне объекты Connection, так что это хорошо.

Должен признать, я действительно не знаю точно, как это работает. Я написал тестовый код, чтобы узнать, смогу ли я выяснить, как работает объект InitialContext:

package twittersearch.web;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
import twittersearch.model.*;
public class ContextTest extends HttpServlet {

    public void doGet(HttpServletRequest request,
                   HttpServletResponse response) 
       throws IOException, ServletException {
  Context ctx = null;
  Context env = null;
  try {
      ctx = new InitialContext();
            Hashtable<?, ?> h = ctx.getEnvironment();
            Enumeration<?> keyEn = h.keys();
            while(keyEn.hasMoreElements()) {
                Object o = keyEn.nextElement();
                System.out.println(o);
            }
            Enumeration<?> valEn = h.elements();
            while(valEn.hasMoreElements()) {
                Object o = valEn.nextElement();
                System.out.println(o);
            }
   env = (Context)ctx.lookup("java:comp/env");
   h = env.getEnvironment();
   Enumeration<?> keys = h.keys();
   Enumeration<?> values = h.elements();
   System.out.println("Keys:");
   while(keys.hasMoreElements()) {
       System.out.println(keys.nextElement());
   }
   System.out.println("Values:");
   while(values.hasMoreElements()) {
       System.out.println(values.nextElement());
   }
   Collection<?> col = h.values();
   for(Object o : col) {
       System.out.println(o);
   }
   DataSource dataSource = (DataSource)env.lookup("jdbc/twittersearchdb");
   Connection conn = dataSource.getConnection();
   if(conn instanceof Connection) {
       System.out.println("Have a connection from the pool");
   }
  } catch(Exception e) {
      e.printStackTrace();
  }
 }
}

Это дает мне вывод:

java.naming.factory.initial
java.naming.factory.url.pkgs
org.apache.naming.java.javaURLContextFactory
org.apache.naming
Have a connection from the pool
Keys:
Values:
Have a connection from the pool

Что я не понимаю

  1. У меня есть объект InitialContext, который, насколько я понимаю, должен быть в состоянии получить Hashtable с ключами и значениями всех привязок для этого контекста. Как показывают первые четыре строки выходных данных, было только две привязки. Тем не менее я могу использовать ctx.lookup ("java: comp / env"), чтобы получить другой контекст, в котором есть привязки для ресурсов для моего веб-приложения. В ключах из тестового вывода объекта InitialContext не было "java: comp / env". Откуда это взялось?

  2. Также, как вы можете видеть, я пытался распечатать ключи и значения из контекста java: comp / env и не получил никакого вывода, и все же я могу использовать env.lookup ("jdbc / twittersearchdb"), который мне источник данных, который я указал в моем context.xml. Почему у меня нет вывода для привязок для контекста "java: comp / env"?

  3. Могу ли я просто подтвердить, что, как я указал элемент Resource в моем context.xml, контейнер создает объект DataSource при развертывании веб-приложения, и вся вещь Context / InitialContext - это просто способ использования JNDI получить доступ к объекту DataSource? И если это так, почему JNDI используется, когда мне кажется проще создать DataSource в реализации ServletContextListener и иметь источник данных в качестве атрибута ServletContext?

  4. Действительно ли объект DataSource управляет ConnectionPool или это Контейнер и так ли это объект DataSource просто способ описания соединения?

  5. Как получить доступ к контейнеру напрямую? Какой объект фактически представляет контейнер? Это ServletContext? Я просто пытаюсь выяснить, что контейнер может сделать для меня.

Извиняюсь за длину этого поста. Я действительно хочу прояснить эти проблемы, потому что я уверен, что все эти вещи используются в каждом веб-приложении, поэтому мне нужно отсортировать их.

Большое спасибо заранее

Джо

...