1

我正面临这个特殊的问题。我的 webapp 在我的本地主机上运行良好。它是一个 JSP/Struts-Tomcat-MySQL 应用程序。但是,当我在 hostjava.net(共享 tomcat)上托管它时,它无法连接到数据库。

经过一些调试,我已经确定了问题,即使用 JNDI 查找数据源。如果需要,可以查看http://rohitesh.hostjava.net/MapsDummyLog.htm上的日志

有关上下文信息位置的一些详细信息:/META-INF/context.xml 包含:

<Context path="" docBase="" debug="5" reloadable="true" crossContext="true" override="true">
   <Resource name="jdbc/ConnectionPooling" auth="Container" type="javax.sql.DataSource"
    maxActive="10" maxIdle="5" username="[username]" password="[password]" driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost/[db name]?autoReconnect=true" />
</Context>

谁能帮我找出问题所在,拜托?

干杯,Rohitesh。

4

9 回答 9

3

这不应该:

url="jdbc:mysql://localhost/[db name]?autoReconnect=true"

真的指向托管数据库的服务器的名称吗?在远程主机上,数据库服务器可能与 tomcat 实例不是同一台机器。我认为你必须说

url="jdbc:mysql://[Server_Name]/[db name]?autoReconnect=true"

于 2008-10-25T14:31:27.383 回答
2

这是我的猜测:

你说这是共享主机。那么不应该

<Context path="" 

包含您的特定应用程序的上下文路径?

http://tomcat.apache.org/tomcat-5.5-doc/config/context.html 此 Web 应用程序的上下文路径,与每个请求 URI 的开头相匹配,以选择适当的 Web 应用程序进行处理。特定主机中的所有上下文路径都必须是唯一的。如果您指定空字符串 ("") 的上下文路径,则您正在为此主机定义默认 Web 应用程序,它将处理所有未分配给其他上下文的请求。

所以你的上下文是无效的,我认为,只是不可见的(这就是为什么 null 驱动程序和 null url)。

它可以在您的本地工作,因为“”是所有已部署应用程序的共享上下文,包括您的应用程序。

于 2008-10-26T02:53:41.567 回答
1

这个限制怎么样:

http://wiki.hostjava.net/index.php/HostJava.net_FAQ 共享 Tomcat 对 server.xml 文件的访问受到限制。只有支持人员才能将 Realm(例如 JDBC Realm)添加到 server.xml 文件中。

看起来您需要寻求支持以添加您的数据源。

于 2008-10-26T12:51:49.160 回答
1

罗希特什,

根据 Vladimir 的回答和评论,您可能需要考虑请求更新服务器上下文(server.xml,或更全局范围的 context.xml)。

如果不出意外,在我看来,这是一个最佳实践。虽然 Tomcat 允许您从 Web 应用程序本身定义上下文(包括 JNDI 资源),但您应该使用此功能的唯一地方是开发人员的本地测试服务器。它使您的 Web 应用程序更具可移植性,因为它允许独立于您的应用程序更改外部资源(在本例中为数据库,但它可以是邮件服务器或内容服务器、规则引擎等)的配置。

我希望这有帮助。

于 2008-10-26T18:44:26.687 回答
0

奇怪的是,同一应用程序的另一部分使用硬编码的 url 访问数据库(使用 DriverManager,而不是来自 JNDI 查找的数据源),并且工作正常(查看日志中的前两行,以及从数据库中读取的带有美食名称的下几行)。因此,可以肯定的是,数据库也在同一台服务器上。

干杯,R

于 2008-10-25T15:05:52.980 回答
0
  • 驱动程序可用吗?试试 Class.forName("com.mysql.jdbc.Driver"); - 它不能位于您的 webapps WEB-INF/lib 中,因为您要求容器(tomcat)为您实例化它:它需要位于服务器类路径中
  • 您运行的是 Tomcat 5.5.x 还是 6.0.x?在 5.0.x 上,context.xml 语法,尤其是资源定义,已经不同:更多的 xml 标记,而不是自 5.5 以来更好更简单的属性。
于 2008-10-25T21:38:44.293 回答
0

“在 org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor) 的 com.Actions.UserAction.execute(UserAction.java:66) 的 com.DAO.UserDAO.userLogin(UserDAO.java:109) 的 java.lang.NullPointerException .java:431) 在 org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236) 在 org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196) "

这告诉我某些东西没有被正确初始化。您在 UserDAO.java 的第 109 行调用什么对象?

“10/25/08(2:08 AM)ajp-127.0.0.1-8015-1 错误 UserDAO.java:104 无法为连接 URL 'null' 创建类 '' 的 JDBC 驱动程序 2008
年 10 月 25 日(2:08 AM) ajp-127.0.0.1-8015-1 错误 UserDAO.java:105 org.apache.tomcat.dbcp.dbcp.SQLNestedException: 无法为连接 URL 'null' 创建类 '' 的 JDBC 驱动程序"

您是否检查了数据库的 URL。看来该 URL 无效或为 NULL。你能给 JDBC 连接 URL 手动赋值吗?

于 2008-10-25T07:25:08.847 回答
0

另一个注意事项:除了您发布的日志文件之外,您是否可以访问任何其他日志文件?如果您有权访问服务器日志/catalina.out 文件,它可能会向您显示 Tomcat 在设置数据源时遇到的确切问题(这在您启动 Tomcat 时是正确的)。

于 2008-10-26T18:48:16.663 回答
0

对不起大家。这是我和托管设施的支持团队之间沟通不畅的问题。配置冲突。他们在 server.xml 中设置了一些旧设置。由于这优先于任何其他上下文信息,因此我面临着这些问题。现在它得到了照顾。

但我仍然觉得,允许人们在共享配置中,将他们的上下文信息放在 META-INF/context.xml 文件中,是一个更好的选择。这样,他们对它有更多的控制权。

但我感谢所有抽出时间做出回应的人。我从你身上学到了很多。再次感谢你。

干杯,R

于 2008-10-27T19:11:18.580 回答