从桌面应用程序访问Web上的SQLite数据库

时间:2012-11-20 03:12:49

标签: java database sqlite

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

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

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

我该如何实现这种类型?

如果db文件在本地目录中,我已经编写了将Java连接到SQLite的代码,并且工作正常。在不必下载数据库文件的情况下,在Web服务器上建立文件链接需要做哪些更改或任何操作。?

提前致谢...

2 个答案:

答案 0 :(得分:4)

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

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

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

在您的使用场景中,您将遇到几个问题。

1)安全性

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

2)无需下载的可更新性

使用HTTP访问数据库文件只能导致请求的资源下载,因为HTTP是stateless protocol,因此当您请求GET甚至POST访问数据库时,Web服务器会提供它给你一个解决方案,完全停止。 在极端综合中,没有机会直接将更改写回数据库文件。

3)下载

的可更新性

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

可能有办法

如果您放弃使用HTTP进行桌面应用程序访问数据库,则可以选择FTP(前提是您拥有该资源的访问凭据)。 FTP允许您从文件中读取数据并将数据写入文件,因此 - 在Linux上 - 您可以使用FUSE挂载远程FTP共享并访问它,就像它连接到本地文件系统(see this article一样),例如)。

在综合中,你:

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

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

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

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

安全可靠,塑料"足以让你做任何你想做的事。


编辑:

MySQL广泛用于网站或Web应用程序,因为它快速,可扩展且相当可靠。在StackOverflow上激活MySQL服务器有点OT并且报告很冗长,但在这种情况下你可以谷歌找到很多文章来讨论你选择的操作系统这个主题。

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

如果你的想法是坚持SQLite,你基本上可以准备四个网络端点:

  1. http://yourwebsite.com/select
  2. http://yourwebsite.com/insert
  3. http://yourwebsite.com/update
  4. http://yourwebsite.com/delete
  5. (注意我指定" http",但您可以考虑转移到SSL加密的http连接,又名" https",查找详细信息herehere我不知道你在运行哪个网络服务器,但是谷歌搜索仍然可以指向一个很好的资源来正确配置https。)

    显然你可以为任何类型的操作添加你喜欢的任何端点,即使是更通用的execute,但只是暂时玩我的游戏。

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

    • 表名称
    • 字段
    • where clause

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

    <强> 1。对每个请求进行签名。您可以实现此定义一个秘密操作密钥(一个字符串,您的客户端和服务器已知但从不以明文形式传播),并在散列函数中使用它来生成摘要,与其他参数一起发送,作为服务器的无可辩驳的证据,其请求它的接收来自真正的来源。这可以避免您在每个请求中发送用户名和密码,如果您不使用https,则会引入密码加密问题,并且涉及服务器必须能够使用相同的请求为同一请求重建相同的签名。相同的算法。 (我以400Mph飞过这个东西,但这个话题太大了,无法在这里得到正确对待。无论如何,我希望这可以指向正确的方向。)

    <强> 2。正确转义请求参数。&#34; Sanitize&#34;有人称它为参数,我认为这个比喻是正确的。一般来说,这个过程涉及服务器端点执行的一些过滤操作,但它基本上可以写成&#34;使用预备语句为您的查询&#34;。如果您不这样做,某些恶意攻击者可能会以某种方式在请求中注入SQL代码以利用您的服务器。

答案 1 :(得分:2)

SQLite是一个嵌入式数据库,它假定数据库文件可以直接访问。 您的申请不是an appropriate use of SQLite

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

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