Я пытался настроить пул соединений с базой данных для моего тестового веб-приложения, просто чтобы узнать, как это делается на самом деле. Мне удалось подключить объект 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
Что я не понимаю
У меня есть объект InitialContext, который, насколько я понимаю, должен быть в состоянии получить Hashtable с ключами и значениями всех привязок для этого контекста. Как показывают первые четыре строки выходных данных, было только две привязки. Тем не менее я могу использовать ctx.lookup ("java: comp / env"), чтобы получить другой контекст, в котором есть привязки для ресурсов для моего веб-приложения. В ключах из тестового вывода объекта InitialContext не было "java: comp / env". Откуда это взялось?
Также, как вы можете видеть, я пытался распечатать ключи и значения из контекста java: comp / env и не получил никакого вывода, и все же я могу использовать env.lookup ("jdbc / twittersearchdb"), который мне источник данных, который я указал в моем context.xml. Почему у меня нет вывода для привязок для контекста "java: comp / env"?
Могу ли я просто подтвердить, что, как я указал элемент Resource в моем context.xml, контейнер создает объект DataSource при развертывании веб-приложения, и вся вещь Context / InitialContext - это просто способ использования JNDI получить доступ к объекту DataSource? И если это так, почему JNDI используется, когда мне кажется проще создать DataSource в реализации ServletContextListener и иметь источник данных в качестве атрибута ServletContext?
Действительно ли объект DataSource управляет ConnectionPool или это Контейнер и так ли это объект DataSource просто способ описания соединения?
Как получить доступ к контейнеру напрямую? Какой объект фактически представляет контейнер? Это ServletContext? Я просто пытаюсь выяснить, что контейнер может сделать для меня.
Извиняюсь за длину этого поста. Я действительно хочу прояснить эти проблемы, потому что я уверен, что все эти вещи используются в каждом веб-приложении, поэтому мне нужно отсортировать их.
Большое спасибо заранее
Джо