«локальные» каталоги JDNI доступны только для чтения в Tomcat. Тем не менее, вы можете связать «глобальные» ресурсы JNDI в LifecycleListener, а затем «связать» их с вашим контекстом (ами) (*):
Вам необходимо реализовать org.apache.catalina.LifecycleListener http://tomcat.apache.org/tomcat-6.0-doc/api/org/apache/catalina/LifecycleListener.html
Затем зарегистрируйте его в вашем server.xml следующим образом (вместе с другими слушателями):
<Listener className="yourlistener.YourLifecycleListener"/>
Ваш слушатель должен ждать 2 события:
public void lifecycleEvent(final LifecycleEvent event) {
if (Lifecycle.START_EVENT.equals(event.getType())) {
// Create your datasource instance...
Context initContext = new InitialContext();
initContext.createSubcontext("jdbc");
initContext.createSubcontext("jdbc/oracle");
initContext.rebind("jdbc/oracle/myDataSource", myDataSource);
} else if (Lifecycle.STOP_EVENT.equals(event.getType())) {
// unbind...
}
}
Затем вам нужно будет распространять доступ к ресурсам, «связывая» их из «глобального» каталога JNDI с «локальным» каталогом JNDI, используя элемент ResourceLink в вашем META-INF / context.xml:
<ResourceLink name="jdbc/oracle/myDataSource" global="jdbc/oracle/myDataSource"
type="javax.sql.DataSource" />
Это сработало для меня до сих пор.
(*) Некоторые заметки:
Есть преимущество в использовании слушателей жизненного цикла. Поскольку порядок создания контекста не гарантирован. Преимущество состоит в том, что все ваши контексты будут видеть этот объект созданным.
Если вам нужно создавать и настраивать создание источника данных более динамично, чем при создании прослушивателя жизненного цикла, обратите внимание, что вы можете связать пользовательский класс, реализующий шаблон Factory.
Чтобы избежать проблем с несовместимостью загрузки классов, рассмотрите возможность помещения классов слушателя, источника данных и т. Д. В файл jar в каталоге lib Tomcat, чтобы они были включены в общий загрузчик классов.
Привет.