有人能回答我的难题吗?用哪种方法将Android设备连接到mySQL或Postgresql?

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

有人能用一些事实来解释为什么吗?

EDIT:我没有提到它更简单,通过jdbc完成它所需的时间更少.那么,为什么是web服务,或者为什么不是?

推荐答案

你可以看到,使用JDBC更简单、更快,因为你没有考虑手机和便携式设备的真实操作环境.它们通常通过有缺陷的流量重写代理和疯狂的防火墙实现脆弱的连接.他们通常使用的网络传输层具有高且可变的数据包丢失率和延迟,这些数据包丢失率和延迟在短时间内变化了许多数量级.在这种环境下,TCP真的不是很好,尤其是在长时间连接的情况下.

web服务的主要好处在于:

  • 连接时间短,状态最低,因此当设备切换WiFi网络、与蜂窝网络之间切换、短暂失go 连接等时,很容易回到您的位置;和

  • 除了最可怕、最严厉的网络代理之外,其他所有代理都可以通过

直接JDBC连接会遇到问题.一个挑战是可靠地对死掉的连接进行计时,重新建立会话,并释放旧会话持有的锁(因为服务器可能不会在客户端确定它死掉的同时确定它死掉).另一个是数据包丢失,导致操作非常缓慢,数据库事务长时间运行,以及锁持续时间和事务清理任务的后续问题.你还会遇到各种各样的疯狂的、坏掉的代理和sun下的防火墙——代理支持CONNECT个,但结果却认为所有流量都是HTTPs,如果不是的话,就把它弄坏;带有错误状态连接跟踪的防火墙,会导致连接失败或进入半开放僵尸状态;你能想象的每一个NAT问题;运营商"有益地"生成TCP ACK以减少延迟,更不用说丢包发现和窗口大小调整带来的问题;古怪的端口阻塞;等

因为everyone使用HTTP,所以你可以预期它会起作用——至少,比其他任何东西都要频繁得多.现在,即使在移动web应用程序中,普通网站也使用REST+JSON通信方式,这一点尤其正确.

您还可以使用唯一的请求令牌将web服务调用写入idempotent.这样,你的应用程序就可以重新发送修改请求,而不用担心会对数据库执行两次操作.见idempotencedefinining idempotence.

说真的,移动设备的JDBC现在看起来是一个好主意——但我唯一能想到的是,如果移动设备在我的直接控制下都在一个高可靠的WiFi网络上.即便如此,出于数据库性能管理的考虑,如果可能的话,我也会避免使用它.您可以使用PgBouncer之类的工具在服务器端的多个设备之间共享连接,因此连接共享不是一个大问题,但清除丢失和放弃的连接是一个大问题,使其工作所需的tcp keepalive流量以及来自放弃的连接的长期停滞的事务也是一个大问题.

Postgresql相关问答推荐

Docker化的PostgreSQL:FATAL:用户&postgres的密码身份验证失败

在Ubuntu 18.04 Bionic上安装PostgreSQL(已删除回购)

Ubuntu 上的 PostgreSQL 安装:找不到initdb命令

如何在 MockDataProvider 中创建自定义 JOOQ 记录?

如何判断上次在 TimescaleDB 上运行连续聚合作业(job)的时间

订阅标签保存在哪个表中?

Postgresql如何从jsonB列的数组中的多个json中 Select 一个值

PostgreSQL 中的复制槽是否会阻止删除 WALL,即使它们来自另一个数据库?

我可以使用 Rails 将数组存储在 hstore 中吗

在 Ubuntu 11.04 服务器中启用对 postgresql 的 PHP 支持

timezone date_trunc 函数

H2 postgresql mode模式似乎不起作用

如何在 psql 控制台中打印当前工作目录?

Postgresql varchar 是否使用 unicode 字符长度或 ASCII 字符长度计算?

可以为空的列在 PostgreSQL 中是否会占用额外的空间?

PostgreSQL/JDBC 和 TIMESTAMP 与 TIMESTAMPTZ

Postgresql:备份所有表 struct ,但只备份少数数据表

使用 SQLAlchemy 进行 PostgreSQL ILIKE 查询

PostgreSQL - 如何在不同时区呈现日期?

Rails ActiveRecord:PG::Error:错误:column reference "created_at" is ambiguous