После нескольких часов стрижки моих (уже редких) волос мне удалось заставить мой сервер tomcat объединить подключения к базе данных с Oracle и использовать среду Spring.
Хотя я и ответил бы на этот вопрос, хотя, кажется, ответ есть, на тот случай, если он кому-нибудь еще поможет.
Что я хотел:
Пул соединений, администрируемый Tomcat (а не для сервлета), и конфигурация для соединения с БД в конфигурации сервера Tomcat (опять же, вместо файлов конфигурации сервлета).
У нас есть несколько экземпляров Tomcat, и каждый из них подключается к определенной БД Oracle, но разработчики создают сервлеты, которые могут потребоваться для запуска на любом из них, поэтому я не хочу, чтобы детали подключения к БД в файле WAR они производят, но позволяют им искать его и получать источник данных этого сервера через JNDI.
На сервере Tomcat conf/context.xml
я добавил следующий код:
<Resource name="jdbc/banner"
auth="Container"
factory="org.apache.commons.dbcp.BasicDataSourceFactory"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@DBan8DB1.example.ac.uk:1522:bde8"
username="dbsro"
password="verysecret"
initialSize="5"
maxActive="20"
maxIdle="10"
removeAbandoned="true"
global="jdbc/banner"
maxWait="-1"/>
Очевидно, что у меня есть файлы JAR ojdbc, pool и dbcp, присутствующие в директории Tomcat lib
на сервере.
Здесь важно отметить, что type
имеет "javax.sql.DataSource"
, а не "org.apache.commons.dbcp.BasicDataSource"
, как я изначально думал, что это должно быть.
Теперь в WEB-INF/web.xml
веб-приложения я добавил следующее:
<resource-ref>
<description>Oracle Banner Datasource</description>
<res-ref-name>jdbc/banner</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
и в файле servlet-context.xml
моего веб-приложения (где бы вы ни находились, ваш файл может отличаться) у меня было это Это не весь файл, но здесь важно пространство имен XML для частей jee:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/banner" resource-ref="true" />
Снова обратите внимание на полностью квалифицированную ссылку jndi-name="java:comp/env/jdbc/banner"
, которая, казалось, требовалась. Почему это не нужно в разделе resource-ref файла web.xml
, я понятия не имею.
Если у кого-то есть мысли по этому поводу, я был бы рад их прочитать.
Кстати, этот URL помог: How to to источника данных Tomcat6 JNDI
После всего этого соединение заработало. Поэтому я вытирал кровь, пот и слезы со своего рабочего места и наслаждался вкусной чашкой свежего кофе.