2015-02-11 2 views
0

Я пытаюсь настроить источник данных jsbc для моего приложения вкак правильно настроить JNDI источника данных в котом 8

-tomcat_home- \ конф \ Catalina \ локальный

Мое приложение " reportExport».war так я создал reportExport.xml с этим содержанием:

<Context> 
    <Resource name="jdbc/mssql" auth="Container" type="javax.sql.DataSource" 
    username="user" 
    password="pass" 
    driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" 
    url="jdbc:sqlserver://localhost:52015;databaseName=rewe;integratedSecurity=false;" 
    maxActive="20" 
    maxIdle="10" 
    validationQuery="select 1" /> 
</Context> 

Я добавил к web.xml это:

<resource-ref> 
    <description> 
     This app requires a ms sql connection. 
    </description> 
    <res-ref-name> 
     jdbc/mssql 
    </res-ref-name> 
    <res-type> 
     javax.sql.DataSource 
    </res-type> 
    <res-auth> 
     Container 
    </res-auth> 
</resource-ref> 

Возможно, я могу опустить поля, которые я уже дал в reportExport.xml ?!

в Java я стараюсь, чтобы получить соединение, как это:

((DataSource) (new InitialContext()).lookup("java:comp/env/jdbc/mssql")).getConnection() 

Соединение работает плавник в Java, но есть 2 проблемы.

Первая проблема: если я поставил reportExport.xml в правильный путь до развертывания приложения Tomcat бросает исключение:

org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].Sta 
ndardContext[/reportExport]] 
... 
Caused by: java.lang.IllegalArgumentException: The main resource set specified [C:\Users\moritz\entwicklung\apache-tomca 
t-8.0.18\webapps\reportExport] is not valid 
... 

11-Feb-2015 14:15:38.303 SEVERE [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDescriptor Error de 
ploying configuration descriptor C:\Users\moritz\entwicklung\apache-tomcat-8.0.18\conf\Catalina\localhost\reportExport.x 
ml 
... 

После развертывания веб-приложения начало прекрасно. Вторая проблема - это reportExport.xml удаляется при распаковке веб-приложения.

Так что что-то не так с моей настройкой: я хочу, чтобы системный администратор настроил источник данных, предназначенный для моего приложения. Мне нравится идея с отдельным файлом для каждого веб-приложения, но исключение при первой настройке и удаление при распаковке являются плохими. С другой стороны, вероятно, хорошо настроить источник данных в server.xml, но как настроить элемент «context» там, чтобы сделать источник данных доступным только для определенного приложения?

ответ

6

OK, Самый простой способ: - в server.xml объявить глобальные ресурсы (почти сверху), используя тот же самый syntaxt, что и в файле reportExport.xml. Если вы называете каждый источник данных, например jdbc/reportExport , то каждый из ваших веб-приложений может использовать другое соединение, вам просто нужно обновить код, чтобы вызвать «настроенное имя». Так внутри вы .WAR в MET-INF файл/context.xml (прежде чем строить войну в Сети/META_INF/context.xml) вам необходимо refrence глобальных ресурсов:

<ResourceLink global="jdbc/reportExport" name="jdbc/reportExport" type="javax.sql.DataSource"/> 

, а затем получить доступ к нему обычно от вас код.

Если вы хотите, вы можете даже переименовать его в context.xml в jdbc/mssql, поэтому ваш Java-код увидит его как прежде, но он укажет на правильный источник данных. Но я бы рекомендовал хранить разные имена в каждом приложении, чтобы вы непосредственно видели, к чему вы обращаетесь (личный вкус).

Основная проблема с этим решением заключается в том, что другое веб-приложение может ссылаться на любой из глобальных ресурсов в его контексте. Xml и получает к ним доступ. Однако, если вы отвечаете за код/​​сервер, это не должно быть большой проблемой.

Если это так, вы не вручную ставите.xml в папке webapps, но вы добавляете его содержимое в описание контекста под элементом хоста по умолчанию (некоторые в конце server.xml). Но tomcat всегда будет искать приложения, на которые есть ссылки (при этом вы будете получать сообщения об ошибках при распаковке приложения), также если вы добавите новый ресурс в свой элемент (переменная, а не глобальный источник данных), описание вашего сервера должно быть обновлено снова.

Так что, если это не важно с точки зрения безопасности, то GlobalResources плюс повторная ссылка на них в context.xml вашего веб-приложения является самым простым способом.

+0

На данный момент у меня есть «resource-ref» в моем web.xml. Что с этим связано в отличие от ResourceLink в context.xml? Поскольку в файле server.xml нет элемента Context, я должен добавить его или добавить только ресурс? – dermoritz

+1

Насколько я знаю, вам нужен resourcelink в вашем контексте, те, что в web.xml, предназначены для документации (или на них не ссылаются java: comp/env, поскольку они не являются средой). Но я могу ошибаться, поскольку я не очень много играл с этим. Начните с того, что работает, и затем вы можете его настроить. a) объявить DataSource в глобальных ресурсах, b) добавить context.xml в ваш военный файл, c) описать resourcelink в вашем контексте. xml. Если он работает, переместите описание контекста на элемент хоста server.xml, если вы не хотите, чтобы контекстный файл в вашей войне (но почему бы вам не захотеть его там?) – Zielu

Смежные вопросы