Как я понимаю, JNDI предназначен для хранения ссылок на объекты или объектов фабрики .
Объект дело простое - configurer предоставляет ссылку на объект, приложение использует его, так просто. Но для более сложных или общих случаев удобнее предоставить ссылку на фабрику объектов , которая дает гораздо больше свободы при создании объектов.
Так как вы не опубликовали web.xml
своего веб-приложения или conf/server.xml
Tomcat, сложно еще что-то уточнить, но я думаю, у вас есть что-то подобное в вашем web.xml
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/myDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
Если вы прочитаете Tomcat's JNDI howto , вы должны увидеть это:
При условии, что Tomcat может определить подходящую фабрику ресурсов для использования в
создайте ресурс и больше никакой информации о конфигурации не требуется, Tomcat
будет использовать информацию в /WEB-INF/web.xml для создания ресурса.
Теперь давайте посмотрим на реализацию Tomcat выше . В строке 112 вы можете видеть, что если задано res-type
равно javax.sql.DataSource
, оно использует org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory
для создания нового источника данных.
Вот и все. На данный момент работа JNDI завершена, поскольку она не имеет никакого влияния на то, как создаются объекты - и это справедливо! Не забывайте, что JNDI предназначен для хранения ссылок на любые объекты (почтовые соединения, области безопасности и т. Д.). Было бы невозможно и неразумно написать тест для каждого другого типа объекта. И даже в этом случае, просто имея настройки базы данных, было бы невозможно определить, достаточно ли их для установления реального соединения с реальной базой данных.
Вот почему у вас есть отдельный вызов, datasource.getConnection()
, и поэтому он выбрасывает SQLException
, который вы должны ловить и обрабатывать.
p.s. Вы могли бы поспорить, что BasicDataSourceFactory
должен быть более умным и иметь список обязательных свойств / аргументов. Может быть. Но это вопрос другого вопроса, как вы изначально задали , почему LOOKUP не сработал ;)