Мы проходим процесс обновления нашего программного обеспечения базы данных, а также переход от Tomcat 5.5 к Tomcat 7. В результате я использую новый драйвер JDBC, в данном случае рекомендуемый драйвер SQL Anywhere JDBC 4.0, для которого требуется служба ODBC.
У меня был большой успех, чтобы все это работало в Eclipse. Но как ни странно, когда я пытаюсь запустить Tomcat вне Eclipse, я получаю следующую ошибку:
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory
([Sybase][JDBC Driver][SQL Anywhere]Database server not found)
Я могу получить чистый Java-драйвер (jConnect) для работы в обеих средах, поэтому я думаю, что ODBC может играть здесь роль. Однако jConnect очень устарел и имеет некоторые другие проблемы, поэтому я не хочу его использовать.
Вот фрагмент context.xml из моего подкаталога META-INF в моем веб-приложении:
<Context docBase="web" path="/web" reloadable="false">
<!-- Access to the database -->
<Resource auth="Container"
description="Pooled connection to the web database"
maxActive="30" maxIdle="5" maxWait="10000" name="jdbc/web"
removeAbandoned="true"
removeAbandonedTimeout="60"
driverClassName="sybase.jdbc4.sqlanywhere.IDriver"
type="javax.sql.DataSource"
url="jdbc:sqlanywhere:DSN=testweb" />
</Context>
Соответствующий файл jar, sajdbc4.jar, находится в $ {TOMCAT_HOME}/lib. Я также попытался добавить его в системный путь к классам, что не имело никакого значения.
Сервер Eclipse использует свои собственные данные о метапространстве, но единственное существенное различие, которое я видел, это добавление следующей строки в server.xml в теге Host:
<Context docBase="web" path="/web" reloadable="true"
source="org.eclipse.jst.jee.server:web"/>
Я попытался добавить эту строку к моей автономной установке, и Томкат возразил. Я также попытался добавить его за вычетом атрибута источника, зависящего от Eclipse, и ничего не сделал.
Я работаю на Windows 7 и пытался отключить брандмауэр в случае, если это имеет значение. Кажется, это не так. Источник ODBC является системным DSN и должен быть доступен для всех. Когда я помещаю поддельное имя DSN в Tomcat для тестирования, он говорит мне, что не может найти его (другое сообщение об ошибке).
В этот момент я потратил очень много времени на это, и я полностью потерял его. Я бы предпочел не настраивать базу данных с помощью кода Java, особенно, поскольку он работает в Eclipse, но производство будет автономной средой.
Я нашел решение и надеюсь, что это может спасти другим горе.
Необходимо указать драйверу JDBC SQL Anywhere явно использовать протокол TCP/IP. Вам также не нужно проходить через ODBC. Я запускаю сервер базы данных как отдельный процесс, поддерживая имя сервера "testweb". Затем я использую следующую строку подключения в определении ресурса:
url="jdbc:sqlanywhere:Server=testweb;UID=xxx;PASSWORD=xxx;port=2638;LINKS=tcpip(PORT=2638)"
И это делает трюк.