【问题标题】:Java Desktop Application to connect to database用于连接数据库的 Java 桌面应用程序
【发布时间】:2013-03-14 21:19:11
【问题描述】:

我有一个桌面应用程序,它使用 JDBC。每当我使用 localhost 时,我对 JDBC 没有任何问题。现在,我要连接到不允许远程连接的服务器。有人建议我提供一个 Web 服务作为我的应用程序和数据库之间的网关。

我能想到的另一种解决方案是,寻找一个允许远程连接的 mysql 服务器。我发现很难找到可以清楚地理解 Java 中的 Web 服务的教程。我做了一些研究,有人告诉我可以使用 PHP 编写 Web 服务并生成 JSON 文件,然后我可以在 java 中解析它。但如果我这样做,我所有的 JDBC 代码都必须重新编码/删除。

是否可以在不删除我的 JDBC 代码的情况下远程连接到数据库?或者我可以将 Tomcat 与 JDBC 结合起来吗?谢谢!

这就是我得到的..

线程“主”com.mysql.jdbc.exceptions.jdbc4.CommunicationsException 中的异常:通信链接失败 引起:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障 原因:java.net.ConnectException:连接超时:连接

【问题讨论】:

    标签: java mysql web-services tomcat jdbc


    【解决方案1】:

    您的问题似乎导致了与此类似的架构:

    但与您的问题所暗示的不同 - 服务器端模块不会将数据库查询从桌面应用程序中继到数据库 - 它充当成为客户端的桌面应用程序的服务器应用。

    这意味着对您的应用程序进行重新架构(我认为这不是一个真实的词)——而是一种常见的最佳实践。服务器端模块负责对您的用户进行身份验证和授权,以确保没有人可以对数据库执行恶意活动。

    这里没有简短的答案 - 你需要考虑这是否是你想要的方向。

    其他人建议的替代方法是允许从桌面应用程序通过防火墙直接访问数据库。我假设您在此处发帖,因为负责数据库完整性的人员告诉您不应该这样做。

    【讨论】:

    • 有人告诉我,服务器实际上不允许远程连接,是的,出于安全原因..
    • 某些机器最终需要与数据库服务器通信,问题是哪个接口可用。数据库接口不安全。然而,应用程序接口,无论是通过 Web 服务、JMS、EJB 还是您选择的任何其他接口 - 都将拥有更少的权限,更不易受到攻击,并且更容易保护。服务器端模块甚至不必与数据库服务器部署在同一台机器上,您的系统工程师可以确保这一点。
    • 真的不可能允许服务器。我唯一的选择(如果我真的想保留我的代码)是寻找一个 mysql 服务器。我看到的东西正确吗?
    • 我不知道mysql会如何解决这个问题,如果你的桌面应用程序不允许直接访问数据库,你已经重新考虑了你的架构
    【解决方案2】:

    我认为您在这里不需要网络服务。要解决您的问题,您可以在 MySQL 服务器中启用远程访问。请按照this blog 中的说明进行操作。如果您的 MySQL 服务器托管在 Windows 环境中,请同时参考 this document

    之后,使用远程 MySQL 服务器域或 IP 地址更新您的 JDBC URL。

    【讨论】:

    • 我会试试这个。谢谢!
    【解决方案3】:

    将数据库与 Web 服务连接起来是非常不推荐的。

    以这种方式认为 Web 服务具有输入/输出模式。 所以你想用method1从table1中获取数据。 table2 与 method2 等...

    因此,为该数据库服务器提供远程访问可能没问题。

    【讨论】:

    • 为 JDBC 连接打开远程数据库是最糟糕的安全噩梦,除非您明确隐藏它。相关讨论stackoverflow.com/questions/442862/…
    • 为什么要这样说:“将数据库与 Web 服务连接起来非常不推荐。”?
    【解决方案4】:

    您可以在 MySQL 中允许远程连接。您将不得不根据运行它的服务器(here's debian 的一个)搜索详细信息的指南。尽管如果您不信任运行应用程序的人员或数据库包含敏感数据,我强烈建议您不要这样做,而是使用 PHP,因为它会带来很多安全问题。如果任何时候只有一个 IP 地址需要连接,您应该只允许该 IP 地址连接,这样可以减少安全漏洞。

    【讨论】:

    • 我要使用的服务器不允许远程连接。 :( 是否可以在没有 Web 服务的情况下直接与服务器通信?我会调查一下。谢谢!
    • 如果服务器不允许,不。你可以做的是用你现有的代码在java中构建一些东西(当前的JDBC代码可以在服务器上——你可以通过ObjectOutput/InputStream轻松地与它对话),如果允许java的话。否则你将不得不重新开始。
    • 如果我找到允许远程连接的服务器,那么,我可以直接与数据库通信吗?我一直在网上寻找免费的 mysql 服务器,但我发现很难找到一个好的。我见过 cPanel、freemsyql.net 等。
    • 是的,这会“很好”。不过,您必须在代码中处理一些复杂问题(例如超时)。我不知道任何允许远程连接到数据库的免费提供商,抱歉(根本不知道很多,所以不要放弃寻找!)。
    【解决方案5】:

    除了防火墙规则之外,没有什么可以阻止您使用 JDBC 访问远程数据库。将您的数据库凭据暴露给客户端通常被认为是一种不好的做法 - 即使在代码中进行了硬编码。这是一种在架构上存在缺陷的方法,不应仅考虑学校作业。

    但是,如果您需要解决方案,您可以查看以下选项: 1)检查Mysql运行的IP地址。它不能是本地主机,而是像 192.168.1.2 等 IP。 2)检查JDBC错误是否与Authentication相关,然后您需要为用户帐户添加权限。 MySQL 安全模型将用户名和用户可以登录的 IP 联系起来。您可能需要更正这些。

    如果两者都正确,请发布您在使用 JDBC 时遇到的确切异常。

    【讨论】:

    • 如果我能找到允许远程连接的服务器,这是否意味着我可以直接访问我的数据库?好的,请稍候,在我的问题中包含例外..
    • 是的。明确地。等待帖子。
    【解决方案6】:

    您不必使用网络服务。您可以实现任何形式的客户端/服务器通信,例如Web 服务、REST、RMI、本机套接字等。值得研究这些并确定哪个最合适。不过……

    这让我觉得这是一个架构问题,而不是围绕特定技术的问题。在我看来,您正在被引导实现一些服务,这些服务不仅允许您访问数据库,而且提供更丰富的 API。例如您不希望您的客户插入表格。您应该提供一个 API 以添加到购物篮。即您在不同的抽象级别上工作(将来您可能会以完全不同的方式实现您的数据库,并且您不想更改您的客户端)。

    以上是 Java EE 世界和更广泛的标准模式。

    【讨论】:

    • 我对重新设计它的想法持开放态度。但是,如果我能保留我的代码并避免重新编码,那将是一种解脱>.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多