我们正在经历升级数据库软件的过程,也正在从Tomcat 5.5升级到Tomcat7。结果,我正在使用新的JDBC驱动程序,在本例中为推荐的SQL Anywhere JDBC 4.0驱动程序,它需要ODBC服务。
我将其全部用于Eclipse方面取得了巨大的成功。但是奇怪的是,当我尝试在Eclipse之外运行Tomcat时,出现以下错误:
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory ([Sybase][JDBC Driver][SQL Anywhere]Database server not found)
我 可以 得到一个纯Java驱动程序(jConnect)在这两种环境中运行,因此我认为ODBC可能在这里发挥了作用。但是,jConnect非常过时,并且存在其他一些问题,因此我不想使用它。
这是Web应用程序下我的META-INF子目录中的context.xml代码段:
<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服务器正在使用其自己的元空间数据,但是我看到的唯一显着区别是在Host标记内的server.xml中添加了以下行:
<Context docBase="web" path="/web" reloadable="true" source="org.eclipse.jst.jee.server:web"/>
我尝试将此行添加到我的独立安装中,但Tomcat拒绝了。我还尝试添加它,减去Eclipse特定的source属性,但是它什么也没做。
我在Windows 7上运行,并尝试关闭防火墙以防万一。似乎并非如此。ODBC源是系统DSN,并且所有人都应该可以访问。当我将虚假的DSN名称添加到Tomcat进行测试时,它告诉我找不到它(不同的错误消息)。
在这一点上,我已经花了很长的时间,完全不知所措。我宁愿不通过Java代码来建立数据库,尤其是因为它在Eclipse中可以正常工作,但是生产将成为一个独立的环境。
我找到了一个解决方案,希望它可以为其他人省去一些麻烦。
有必要告诉SQL Anywhere JDBC驱动程序明确使用TCP / IP协议。您也不需要通过ODBC。我将数据库服务器作为独立进程运行,广播了服务器名称“ testweb”。然后在资源定义中使用以下连接字符串:
url="jdbc:sqlanywhere:Server=testweb;UID=xxx;PASSWORD=xxx;port=2638;LINKS=tcpip(PORT=2638)"
这就是窍门。