JDBC与Android的Web服务
有人能回答我的难题吗?用哪种方法将安卓设备连接到mySQL或Postgresql 我可以用这两种方式来做,没有任何错误和问题,没有明显的区别,但每个人都推荐web服务,而不是使用jdbc驱动程序和直接连接 有人能用一些事实来解释为什么吗 编辑:我没有提到通过jdbc进行编辑更简单,所需时间更少。那么,为什么是web服务呢?或者为什么不是?您认为使用JDBC更简单、更快,因为您没有考虑手机和便携式设备的真实操作环境。它们通常通过有缺陷的流量重写代理和疯狂的防火墙实现脆弱的连接。他们通常使用的网络传输层具有高且可变的数据包丢失率和延迟,这些数据包丢失率和延迟在短时间内变化了许多数量级。TCP在这种环境下确实不是很好,尤其是在长时间连接的情况下 web服务的主要好处在于:JDBC与Android的Web服务,android,mysql,web-services,postgresql,jdbc,Android,Mysql,Web Services,Postgresql,Jdbc,有人能回答我的难题吗?用哪种方法将安卓设备连接到mySQL或Postgresql 我可以用这两种方式来做,没有任何错误和问题,没有明显的区别,但每个人都推荐web服务,而不是使用jdbc驱动程序和直接连接 有人能用一些事实来解释为什么吗 编辑:我没有提到通过jdbc进行编辑更简单,所需时间更少。那么,为什么是web服务呢?或者为什么不是?您认为使用JDBC更简单、更快,因为您没有考虑手机和便携式设备的真实操作环境。它们通常通过有缺陷的流量重写代理和疯狂的防火墙实现脆弱的连接。他们通常使用的网络传
- 具有短时间连接和最小状态,因此当设备切换WiFi网络、从蜂窝网络到/从蜂窝网络、短暂失去连接等时,很容易回到您所在的位置;及
- 可以通过除最可怕和最苛刻的web代理之外的所有代理
连接,但后来证明所有流量都是HTTPs,如果不是HTTPs,就将其破坏;具有错误的有状态连接跟踪的防火墙,导致连接失败或进入半开放的僵尸状态;你能想象的每一个NAT问题;运营商“有益地”生成TCP ACK以减少延迟,更不用说丢包发现和窗口大小调整带来的问题;古怪的端口阻塞;等等
因为每个人都使用HTTP,所以你可以期待它会起作用——至少,比其他任何东西都要频繁得多。现在,即使在移动web应用程序中,普通网站也使用REST+JSON通信方式,这一点尤其正确
您还可以使用唯一的请求令牌将web服务调用编写为幂等。这样,您的应用程序就可以重新发送修改请求,而不用担心会对数据库执行两次操作。见和
严重的是,JDBC现在从一个移动设备看来可能是个好主意——但我唯一能想到的是,如果移动设备在我的直接控制下都在一个高可靠的WiFi网络上。即使这样,出于数据库性能管理的考虑,如果可能的话,我也会避免使用它。您可以使用PgBouncer之类的工具在服务器端的许多设备之间共享连接,因此连接共享不是一个大问题,但清除丢失和放弃的连接是一个大问题,使其正常工作所需的tcp keepalive通信量以及放弃的连接导致的长期停滞的事务也是一个问题。除了Craig Ringer所说的一切,我完全同意这一点,JDBC还有另一个问题:它将迫使向世界公开您的数据库。如果你想让android设备访问它,你需要为你的应用程序提供数据库凭据,并且数据库必须具有公共访问权限
使用Web服务或RESTful API显然是确保应用程序安全的方法。我可以想出几个原因
对数据库的JDBC android驱动程序支持
跨各种Android设备的连接池化使得监控和限制这些设备变得困难
从DB发送到android的结果集将消耗大量的带宽和电池电量
代理都允许HTTP访问您的设备
直接向客户机公开数据库具有安全性含义
Web服务可以在JDBC连接上提供附加功能,如身份验证/服务质量授权/条件获取请求/错误处理等。JDBC无法执行任何这些操作。另一种选择是使用数据库SymmetricDS之类的同步工具
这将使您的服务器上有一个Postgres数据库,平板电脑上有一个SQLite数据库
当连接可用时,SymmetricDS将通过HTTP同步数据库。当然,您不必同步整个数据库,只需同步相关部分即可
(我不属于SymmetricDS)我自己以前也提出过安全性论证,但现在我并不真的相信它。数据库中正确设计的权限模型应该与通过经过身份验证的web服务进行访问一样健壮。当然,您的数据库可能有远程可利用的bug,如PostgreSQL 9.2中刚刚修复的讨厌bug。。。但您的应用程序服务器也可能如此,事实上,它很可能具有现代应用程序服务器的疯狂复杂性。出于其他原因,使用web服务仍然是一个非常好的主意,但我认为安全性的论点站不住脚。带宽+功率也不是真的;HTTP+JSON也好不到哪里去。如果你使用的是直接数据库连接而不是应用服务器,你就不会得到额外的目标,只是一个不同的目标。如果将DB锁定在中间appserver/webserver后面,则不能限制使用运行web服务的appserver的IP,也不能将其放置在专用网络上。你藏了一个t