【问题标题】:Can't connect to Derby network server, Not clear what the issue is无法连接到 Derby 网络服务器,不清楚是什么问题
【发布时间】:2017-04-20 03:04:21
【问题描述】:

我可以使用 'ij' 正常连接,但是当我尝试部署我的 warfile 时,我似乎无法获得正确的连接。我怀疑它与 derbyclient.jar 有关,但我已将其添加到我的类路径中,因此 JVM 应该不会有任何问题找到它。我现在已经花了几天时间,我想是时候在这里问了。 PS:我是在远程服务器上部署的新手,(它在我的本地服务器上工作正常)。 catalina.out 日志文件如下。真正奇怪的是 webapp 部分工作。它能够从数据库中提取一些(但不是全部)需要的数据,即使它说它没有连接。

Caused by: ERROR 08001: java.net.ConnectException : Error connecting to server localhost on port 64,414 with message Connection refused (Connection refused).
    at org.apache.derby.client.net.NetAgent.<init>(Unknown Source)
    at org.apache.derby.client.net.NetConnection.newAgent_(Unknown Source)
    at org.apache.derby.client.am.ClientConnection.<init>(Unknown Source)
    at org.apache.derby.client.net.NetConnection.<init>(Unknown Source)
    at org.apache.derby.client.net.ClientJDBCObjectFactoryImpl.newNetConnection(Unknown Source)
    ... 69 more
Caused by: java.net.ConnectException: Connection refused (Connection refused)
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at java.net.Socket.connect(Socket.java:538)
    at java.net.Socket.<init>(Socket.java:434)
    at java.net.Socket.<init>(Socket.java:211)
    at javax.net.DefaultSocketFactory.createSocket(SocketFactory.java:271)
    at org.apache.derby.client.net.OpenSocketAction.run(Unknown Source)
    at org.apache.derby.client.net.OpenSocketAction.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    ... 74 more

我正在使用 Tomcat 8.5、Derby 10.13 并在与 tomcat 相同的远程计算机上运行 Derby 作为 NetworkServer。错误并没有说太多,所以我真的不清楚问题是什么。我猜它找不到 c derby jar 文件,因为它对其中一些显示“(未知来源”),(但这只是一个猜测)。我确实读过其他一些关于将 derbyclient.jar 放入 tomcats 的帖子lib 文件夹,但我什至不确定这是否是问题所在。

我使用以下教程安装 tomcat:digitial Oceans tomcat installation guide 我不确定安装程序如何在远程计算机上工作。关于设置权限有很多东西,并没有真正解释为什么设置这些权限。为什么不为我的用户安装tomcat?创建一个“tomcat”用户组有什么意义?它给问题增加了很多复杂性,而没有明确解释我们为什么这样做以及后果是什么。

现在我目前的策略是按照教程进行到底,然后尝试下面的 cmets 中的工具来诊断问题到底是什么。 希望我不会再花一周的时间来解决这个问题..

【问题讨论】:

  • 不,您发现 derbyclient.jar 很好,否则您会得到 ClassNotFoundException,并且您的异常堆栈跟踪中不会有行显示 org.apache.derby.client.net .* 课程。您可能没有看到 整个 异常。为确保您是,请执行以下操作:wiki.apache.org/db-derby/UnwindExceptionChain
  • “连接被拒绝”可能意味着您的 Derby 网络服务器未在 localhost:64414 上启动和运行。或者,这可能意味着 Derby 网络服务器已启动并正在运行,但某些网络防火墙或其他网络配置阻止了连接。你在什么操作系统上运行?您对网络有足够的了解以执行一些基本的网络诊断吗? (例如,netstat 注释、telnet 命令、ping 命令等)如果是这样,请查看是否可以缩小 Web 应用程序无法启动到 localhost:64414 的网络连接的原因。
  • 使用 Ubuntu 15.10,在 GoDaddy 上,我之前听说过这些工具,但从未在实践中使用过,我会试一试。
  • 我不确定现在发生了什么,因为我不再“拒绝连接”但我仍然无法连接.. netstat 明确表示 localhost:64414 正在监听。当我尝试运行我的 web 应用程序时,我收到错误代码 500,我的数据库访问对象中有一个空指针异常。因此,连接到服务器肯定存在问题。但目前还没有任何线索说明为什么会这样。
  • IT 原来是问题所在,一直以来,我在客户端 javascript 上的所有 ajax 请求都引用了 localhost 而不是远程服务器 IP。但是,我不确定为什么我在数据库上收到连接被拒绝消息。很高兴我现在可以正常工作了。

标签: tomcat web-deployment derby


【解决方案1】:

有多个错误:

第一个问题

在我使用 JQuery 进行 Ajax 调用的 javascript 代码中,我忘记将域从 localhost 更改为主机的域。即我使用的是 $.get("http://localhost:8080/request.do) 而不是 $.get("http://remoteServerIPAddress:8080/request.do)。

因此,当我在远程服务器上启动应用程序时,任何显式调用的 ajax 都不起作用。

它不起作用的原因是 localhost 指的是代码当前正在执行的任何计算机。

由于其 javascript 代码在客户端浏览器(而不是服务器)上运行,所有使用 localhost 的 ajax 调用都试图向客户端计算机而不是远程计算机发出服务器请求,就像他们应该的那样。

下图帮助解释:

第二个问题

Derby 的 ./startNetworkServer 命令要求您在它之前使用 sudo,以便 web 应用程序连接到数据库。

当我不使用 sudo 时,没有任何迹象表明出了什么问题。看起来好像网络已成功启动并正在侦听端口 64414。

但是,当 webapp 启动时,我会收到“连接被拒绝”,但没有明确解释原因。只有通过反复试验(以及几个小时),我才发现这就是原因。

就个人而言,我非常不喜欢“sudo”。

【讨论】:

  • 我不确定我是否理解“sudo”部分,听起来您可能需要进行更多调查以了解那里究竟发生了什么(可能是网络安全,可能是文件系统安全,可能完全是其他东西),但无论如何我很高兴您的应用程序正常运行,并感谢您提供清晰的图表和详细的描述!
  • 谢谢 Bryan,当我发现为什么必须使用 sudo 时,我会更新我的答案。
猜你喜欢
  • 1970-01-01
  • 2016-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多