适用于Android的JDBC与Web服务

fen*_*nix 24 mysql postgresql android web-services jdbc

有人可以回答我的困境,用于将Android设备连接到mySQL或Postgresql的方法是什么?

我可以在没有任何错误和问题的情况下以两种方式做到这一点,没有明显的区别但是每个人都推荐Web服务而不是使用jdbc驱动程序和直接连接,

有人可以用一些事实来解释原因吗?

编辑:我没有提到它更简单,需要更少的时间来完成jdbc.那么,为什么是Web服务,或者为什么不呢?

Cra*_*ger 28

认为使用JDBC更简单,更快捷,因为您没有考虑手机和便携式设备的真实操作环境.他们通常通过错误的流量重写代理和疯狂的防火墙实现连接.它们通常使用网络传输层,该网络传输层具有高且可变的数据包丢失率和延迟,这些延迟在短时间内变化了许多数量级.TCP在这种环境中确实不是很好,特别是与长期连接的斗争.

Web服务的主要优点是:

  • 具有最小状态的短暂连接,因此很容易回到设备切换WiFi网络,进出蜂窝网络,短暂失去连接等的位置; 和

  • 可以通过除了最可怕和最严厉的网络代理之外的所有网络代理

您将经常遇到直接JDBC连接的问题.一个挑战是可靠地超时死连接,重新建立会话和释放旧会话持有的锁(因为服务器可能不会在客户端同时判断它已经死亡).另一个是数据包丢失导致非常慢的操作,长时间运行的数据库事务以及锁定持续时间和事务清理任务的后续问题.您还将遇到各种各样的疯狂和破坏的代理和防火墙 - 支持CONNECT但代之以所有流量都是HTTP并且如果不支持则将其破坏; 具有错误状态连接跟踪的防火墙导致连接失败或进入半开僵尸状态; 您可以想象的每个NAT问题; 运营商"有助于"生成TCP ACK以减少延迟,更不用说导致丢包发现和窗口大小调整的问题; 古怪的港口堵塞; 等等

因为每个人都使用HTTP,所以你可以期望它能够工作 - 至少比其他任何事情都要频繁.现在,即使在移动网络应用中,常见网站也使用REST + JSON通信方式,这一点尤其如此.

您还可以使用唯一请求令牌将您的Web服务调用编写为幂等.这样,您的应用就可以重新发送修改请求,而无需担心它会对数据库执行两次操作.看到幂等性定义幂等性.

说真的,来自移动设备的JDBC现在看起来可能是一个好主意 - 但我认为唯一的方法就是移动设备都在我直接控制下的单个高可靠WiFi网络上.即便如此,如果可能的话,我会出于数据库性能管理的原因而避免使用它.您可以使用类似PgBouncer之类的东西来集中服务器端的许多设备之间的连接,因此连接池不是一个大问题,但是丢失和放弃连接的清理,以及使其工作所需的tcp keepalive流量和长时间停顿来自废弃连接的交易.

  • @StevanPopov你的问题不是带宽,当传输改变时,由于数据包丢失和/或IP交换引起的连接停顿很长.使用无状态Web服务,您可以放弃连接并提出新请求,如果使用完整的JDBC连接比使用更长时间更容易,并且设置更少的往返次数会更快.您还可以让Web服务收集多个查询的输出(或根据第一个查询的结果执行其他查询),并在单个结果中报告所有结果,从而减少往返延迟成本. (2认同)

Pab*_*ruz 6

除了 Craig Ringer 所说的所有事情之外,我完全同意,JDBC 还有另一个问题:它会强制将您的数据库暴露给全世界。如果你想让安卓设备访问它,你需要为你的应用程序提供数据库凭据,并且数据库必须具有公共访问权限。

使用 WebService 或 RESTful API 显然是使您的应用程序安全的方法。


Dee*_*ala 6

我可以想到几个原因

  1. JDBC android驱动程序支持您的数据库.
  2. 跨各种Android设备的连接使得监控和限制它们变得困难.
  3. 从DB发送到android的结果集将消耗大量带宽电池电量.
  4. 代理用户允许HTTP访问您的设备.
  5. 将数据库直接暴露给客户端具有安全隐患.

Web服务可以在JDBC连接之上提供额外的功能,例如身份验证/服务质量/授权/条件GET请求/ 错误处理等.JDBC无法执行任何这些功能.