JDBC与Android的Web服务
有人可以回答我的困境使用哪种方法来连接Android设备到MySQL或Postgresql?
我可以两种方式做到没有任何错误和问题,没有明显的差异,但是大家推荐使用web服务而不是使用jdbc驱动和直接连接,
有人能解释为什么有一些事实?
编辑:我没有提到,这是更简单,需要更less的时间来通过jdbc做到这一点。 那么,为什么Web服务,或者为什么不呢?
您认为使用JDBC更简单快捷,因为您不考虑手机和便携式设备的真实世界操作环境。 他们经常通过错误的stream量重写代理和疯狂的防火墙flakey连接。 他们通常使用networking传输层,其具有高且可变的分组丢失率,并且在很短的时间内在多个数量级上的变化。 在这种环境下,TCP确实不是很好,特别是与长期连接的斗争。
Web服务的主要好处是:
-
以最小的状态存在短暂的连接,所以当设备交换WiFinetworking,移动到/来自蜂窝networking,短暂失去连接性等时,很容易回到您所在的位置; 和
-
除了最糟糕和最严厉的networking代理之外,还可以通过其他网站
您将经常遇到与直接JDBC连接有关的问题。 一个挑战是可靠地超时连接,重新build立会话并释放旧会话保持的locking(因为服务器可能并不认为它在客户端同时死亡)。 另一个是数据包丢失,导致运行速度非常慢,长时间运行的数据库事务以及随之而来的锁持续时间和事务性清理任务的问题。 你还可以遇到各种各样的疯狂和破碎的代理和防火墙下的代理 – 支持CONNECT
代理,但后来假设所有stream量都是HTTP,如果不是,则将其破坏; 具有错误状态连接跟踪的防火墙,导致连接失败或进入半开放僵尸状态; 每个你可以想象的NAT问题; 运营商“帮助”生成TCP ACK以减less延迟,而不用担心导致丢包发现和窗口大小的问题; 古怪的港口封锁; 等等
因为每个人都使用HTTP,所以你可以期望能够工作 – 至less比其他任何事情都要多。 现在,即使在移动web应用程序中,通用网站也使用REST + JSON通信风格,这一点尤其如此。
您也可以使用唯一请求令牌来编写Web服务调用以达到幂等 。 这可以让您的应用程序重新发送修改请求,而不用担心它会对数据库执行两次操作。 见幂等性和定义幂等性 。
严重的是,移动设备的JDBC现在看起来可能是一个好主意 – 但是我认为,如果移动设备全部在一个高度可靠的WiFinetworking上,我直接控制的话,这是唯一的方法。 即使这样我会避免它的数据库性能pipe理的原因,如果我可能的话。 您可以使用像PgBouncer这样的服务器端的许多设备之间的连接池,所以连接池不是一个大问题,但清理丢失和废弃的连接是必需的TCP保持活动stream量,使其工作和长时间的停滞来自废弃连接的交易。
我能想到几个原因
- JDBC android驱动程序支持您的数据库。
- 跨各种Android设备的连接池使得难以监视和限制它们。
- 从数据库发送到android的结果集将消耗大量的带宽和电池电量。
- 代理使用允许HTTP访问您的设备。
- 将数据库直接暴露给客户端会产生安全隐患。
Web服务可以在JDBC连接之上提供附加function,如authentication /服务质量 / 授权 / 条件GET请求/ 错误处理等。JDBC不能执行任何这些操作。
除了Craig Ringer所说的,我完全同意,还有另外一个问题:它会迫使你的数据库暴露给世界。 如果你想要Android设备访问它,你将需要提供你的应用程序的数据库凭据,数据库将不得不公开访问。
使用WebService或RESTful API显然是使您的应用程序安全的方法。
另一种select是使用像SymmetricDS这样的数据库同步工具。
这可以让你有一个在你的服务器上的Postgres数据库和平板电脑上的SQLite数据库。
当连接可用时,SymmetricDS将通过HTTP同步数据库。 你不必同步整个分贝,当然只是相关的部分。
(我不隶属于SymmetricDS)