我们正在完成升级数据库软件的过程,也从Tomcat 5.5升级到Tomcat 7.因此我使用的是新的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的源属性,它什么也没做。
我在Windows 7上运行,并尝试在相关的情况下关闭防火墙。它似乎不是。 ODBC源是一个系统DSN,应该可供所有人访问。当我把一个虚假的DSN名称放到Tomcat进行测试时,它告诉我它找不到它(一个不同的错误信息)。
在这一点上,我花了很长时间才完成这项工作并完全失败。我宁愿不通过Java代码建立数据库,特别是因为它在Eclipse中工作,但生产将是一个独立的环境。
答案 0 :(得分:1)
我找到了一个解决方案,并希望它可以为其他人带来一些悲伤。
有必要告诉SQL Anywhere JDBC驱动程序显式使用TCP / IP协议。您也不需要通过ODBC。我将数据库服务器作为一个独立的进程运行,然后广播服务器名称&#34; testweb&#34;。然后我在资源定义中使用以下连接字符串:
url="jdbc:sqlanywhere:Server=testweb;UID=xxx;PASSWORD=xxx;port=2638;LINKS=tcpip(PORT=2638)"
这就是诀窍。