1

我在网络服务器上有一个 SQLite 数据库。我想从典型的 Java 桌面应用程序访问数据库。目前,我正在做这件事... 将数据库文件下载到本地目录,根据需要执行查询。

但是,我无法对此执行任何更新查询。我怎样才能做到这一点。[关于实际数据库]

另一个问题是,在 java 中直接从 web 访问数据库(这可能吗),进行直接查询,更新任何内容等。

我怎样才能实现这种类型?

如果 db 文件在本地目录中,我已经编写了将 Java 连接到 SQLite 的代码,并且工作得很好。我必须做哪些更改或任何操作才能在网络服务器上建立指向文件的链接,而无需下载数据库文件。?

提前致谢...

4

2 回答 2

4

CL。说得对,如果您需要从桌面应用程序访问 Web 数据库,SQLite 不是一个合适的选择。

在小型网站中使用 SQLite 很好,这些应用程序必须从网站本身访问您的数据;但是,如果您需要从桌面访问数据,而无需下载数据文件,则无法使用 SQLite 和 HTTP 来实现。

您的 Web 应用程序的合适选择是MySQL或其他客户端/服务器数据库,这样您就可以从 Web 应用程序以外的任何地方连接到数据库服务,前提是服务器访问规则集允许(例如防火墙、授予认证等)。

在您的使用场景中,您将面临几个问题。

1) 安全

您将被迫违反安全原则,即必须保护数据库文件免受网络直接暴露;实际上,要从桌面访问您的 Web SQLite 数据库文件,您将被迫直接公开它,这是错误的,因为任何人都可以下载它并访问您的数据,根据定义,这些数据必须只能由您访问。

2) 无需下载即可更新

使用 HTTP 访问数据库文件只能导致请求的资源下载,因为 HTTP 是一种无状态协议,所以当您请求 GET 甚至 POST 访问数据库时,Web 服务器会在一个解决方案中提供给您,句号。在极端合成中,没有机会直接将更改写回数据库文件。

3) 下载可更新性

您可以使用 HTTP GET 请求下载文件、读取数据、进行更改等等,但是如果您的在线数据库同时发生更改怎么办?数据一致性很容易受到影响。

可能有办法

如果您放弃使用 HTTP 为您的桌面应用程序访问数据库,那么您可以选择 FTP(前提是您具有访问资源的凭据)。FTP 允许您从文件读取数据和向文件写入数据,因此 - 在 Linux 上 - 您可以使用 FUSE 挂载远程 FTP 共享并像连接到本地文件系统一样访问它(例如,请参阅本文)。

在综合中,您:

  • 为 FTP 共享创建挂载点(即本地目录)
  • 用于curlftpfs将远程 FTP 资源链接到您的挂载点
  • 从您的应用程序访问此目录,就像它是一个常规目录一样

通过这种方式,您可以保持安全性,防止数据库文件暴露在 Web 上,并且您可以从桌面应用程序访问它。

也就是说,请考虑多个进程(桌面应用程序 + 网络服务器实例)对单个数据库文件的并发访问可能会导致问题(请参阅此 SO 帖子以了解想法)。在构建您的解决方案之前请记住这一点。

最后,在您的使用场景中,我的建议是编写一些服务器端 Web 服务或 REST 接口,在身份验证下,让您与执行所需关键操作的数据库文件进行交互。

它安全、可靠且“可塑”,足以让您为所欲为。


编辑:

MySQL 被广泛用于网站或 Web 应用程序,因为它速度快、可扩展性强且相当可靠。在 StackOverflow 上激活 MySQL 服务器有点过时,而且报告起来很冗长,但在这种情况下,您可以在谷歌上搜索大量文章,讨论您选择的操作系统的此类主题。

然后使用 MySQL JDBC 驱动程序从 Java 桌面应用程序访问数据库。

但是,如果您的想法是坚持使用 SQLite,您基本上可以准备四个 Web 端点:

  1. http://yourwebsite.com/select
  2. http://yourwebsite.com/insert
  3. http://yourwebsite.com/update
  4. http://yourwebsite.com/delete

(注意我指定了“http”,但您可以考虑转移到 SSL 加密的 http 连接,也就是“https”,在此处此处查找详细信息。我不知道您正在运行哪个网络服务器,但仍然可以通过谷歌搜索一点点应该指出您一个很好的资源来正确配置 https。)

显然,您可以为任何类型的操作添加任何您喜欢的端点,甚至是更通用的execute,但只玩一会儿我的游戏。

对这些端点的请求是 POST,每个端点都会收到适当的参数,例如:

  • 表名
  • 字段
  • where 子句

...等等,但最重要的是安全性,所以你必须记住两件事:

1. 签署每个请求。您可以定义一个秘密操作密钥(您的客户端和服务器都知道但从不以明文形式传播的字符串),并在散列函数中使用它来生成一个摘要,该摘要与其他参数一起作为无可争议的参数发送向服务器证明它收到的请求来自真实来源。这避免了您在每个请求中发送用户名和密码,如果您不使用 https,这将引入密码加密问题,并且涉及服务器必须能够使用相同的算法为相同的请求重建相同的签名. (我以 400Mph 的速度飞过这个东西,但是这个话题太大了,无法在这里正确处理。无论如何,我希望这可以为你指明正确的方向。)

2. Properly escape request parameters. "Sanitize" parameters someone calls it, and I think the metaphor is correct. Generally speaking this process involves some filtering operations performed by the server's endpoint, but it basically could be written as "use prepared statements for your queries". If you don't it could be likely that some malicious attacker injects SQL code in requests to exploit your server in some manner.

于 2012-11-20T08:31:31.333 回答
2

SQLite 是一个嵌入式数据库,并假定数据库文件可以直接访问。您的应用程序不适合使用 SQLite

您应该使用客户端/服务器数据库。

在任何情况下,您都不应该在 Internet 上直接访问数据库;数据应该通过网络服务。

于 2012-11-20T07:39:29.337 回答