天道酬勤,学无止境

“默认”提供的 App Engine 版本在更改默认版本后似乎不一致并抖动一段时间(App Engine version served by "default" appears to be inconsistent and thrash for a period after changing the default version)

问题

我们的应用程序提供一个简单地报告 os.environ['CURRENT_VERSION_ID'] 的端点。 我们将其用于一种监视类型,该监视跟踪当前将哪个版本设置为“默认版本”。

从 3 月 5 日下午开始,我们注意到在向该端点发出请求时出现了奇怪的行为。 在我们更改默认版本后不久(通过“appcfg.py set_default_version”),对该端点的重复请求将在先前的默认值和新的默认值之间翻转。 这会持续大约 10 分钟,之后所有后续请求将始终报告新的、正确的默认版本。 因此,在这 10 分钟的窗口中,对我们正常默认 URL 的请求似乎会不一致地报告旧版本或新版本。

这似乎是行为的改变。 我们应用程序的默认版本之前的更改发生在 3 月 1 日,并且在该日期之前的所有其他版本更改都没有表现出这种翻转行为。

(从我队友的错误报告中窃取的问题)

回答1

首先介绍一下背景:

  • App Engine 在分布式基础架构中运行您的应用程序:您的应用程序接收的流量越多,在任何给定时间运行您的代码的实例(应用服务器)就越多
  • 出于可扩展性/简单性和许多其他原因,App Engine 没有实现客户端 <-> 应用服务器粘性; 因此,对默认应用版本的任何请求都可以由任何应用服务器处理

更改应用程序的默认版本后,通过管理控制台更改标记为默认的版本,或部署与当前默认相同的主要版本,有关此更改的信息将通过 App Engine 基础架构传播。 随着应用服务器意识到新版本,它们开始加载新版本的应用程序代码。 一旦给定的应用服务器准备就绪,它将开始提供新版本的代码。

在一段时间内,一些应用服务器将提供以前的默认版本,而其他应用服务器已经在提供新的默认版本。 因此,预计任何具有大量流量的应用都会看到您描述的行为。

我们一直在努力减少这些版本更改所花费的时间,但我们最关心的是确保过渡顺利进行。 如果应用程序有大量实例为以前的版本提供服务,App Engine 需要确保始终有足够的容量(结合新旧应用服务器)来服务所有当前流量。 应用程序的先前版本和新版本可能需要不同数量的应用服务器(由于版本之间的性能差异),这是无法“立即”安全地执行转换的另一个原因。

如果您想对流程进行更多控制,可以使用 App Engine 的流量拆分功能。 您可以逐步增加您希望引导至新版本的用户流量百分比。 然后,App Engine 将根据客户端 IP 地址或 cookie(对于网络应用程序)提供版本粘性。 您还可以使用流量拆分在一定百分比(例如 1%)的客户端上“金丝雀”应用程序的新版本。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Google App Engine 灵活环境定价,500 美元课程(Pricing of Google App Engine Flexible env, a $500 lesson)
    问题 我在 App Engine 灵活环境教程中关注了 Nodejs @:https://cloud.google.com/nodejs/getting-started/hello-world 成功部署并测试了本教程后,我更改了代码以进行一些实验并成功部署它......然后让它继续运行,因为这是一个测试环境(非公开)。 一个月后,我收到了来自 Google 的超过 370 美元的账单! 在交易详情中,我看到以下内容: 2017 年 10 月 1 日至 31 日 App Engine Flex 实例 RAM:5948.774 Gibibyte-hours ([MYPROJECT]) $42.24 2017 年 10 月 1 日至 31 日 App Engine Flex 实例核心小时数:5948.774 小时 ([MYPROJECT]) $312.91 这个几乎有 0 个请求的测试环境如何需要大约 6,000 小时的资源? 在最坏的情况下,我会假设 720 小时全职运行一个月 @ 每小时 0.05 美元将花费我约 40 美元。 https://cloud.google.com/appengine/pricing 有人可以帮助阐明这一点吗? 我一直无法找出为什么需要这么多资源? 谢谢您的帮助! 更多数据,这是上个月的流量(基本为0): 和实例数据 更新:请注意,我确实对 package
  • 在 App Engine 中部署后应用程序未更新(Application does not update after deployment in App Engine)
    问题 我刚开始使用 GAE,途中已经遇到了问题。 当我部署一个应用程序时,它似乎没有更新它,当我在浏览器中运行它时,它仍然运行旧版本。 我的简单代码是: import java.io.IOException; import javax.servlet.http.*; @SuppressWarnings("serial") public class AppEngineProjectServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.setContentType("text/html"); resp.getWriter().println("<p>Hi there</p>"); } } 我在 Eclipse 中创建了一个新的 Web 应用程序项目,并获得了该代码。 我刚刚将文本从“Hello World”更改为“Hi there”,当我部署它时,它仍然运行 Hello World! 在部署新版本并将新版本设置为默认值时,我也尝试更改应用程序的版本,但似乎没有任何效果。 是否有任何我可能忽略的特殊原因导致这种情况发生? 回答1 经过长时间的聊天会话,OP 问题已解决。 要点: 在部署到云之前
  • CSS 文件未在部署时更新 (Google AppEngine)(CSS File Not Updating on Deploy (Google AppEngine))
    问题 我推送了我网站的新版本,但现在 CSS 和静态图像没有正确部署。 这是混乱的页面:http://www.gaiagps.com Appengine 显示最新版本是正确的:http://1.latest.gaiagps.appspot.com/ 有什么帮助吗? 回答1 我以前在 App Engine 上看到过这种情况,即使在使用/stylesheets/default.css?{{ App.Version }}等缓存破坏查询参数时/stylesheets/default.css?{{ App.Version }} 。 这是我的(未经证实的)理论: 您可以通过将新版本部署或更改为default来推送新版本。 虽然此更新正在传播到运行您的应用程序的所有 GAE 实例... ...有人访问了您的网站。 对静态资源default.css{{ App.Version }}的请求被发送到 Google 的 CDN,该 CDN 还没有它。 Google 的 CDN 在对所有实例进行第 2 步的传播之前向 GAE 请求资源。 如果您不走运,GAE 会从运行旧版本的实例中提供资源... ...现在作为权威的“新”版本缓存在 Google 的 CDN 中。 当这种情况(如果发生这种情况)发生时,我可以确认,再多的缓存破坏浏览器工作也无济于事。 Google CDN 服务器持有错误的版本。 修复
  • 如何自动删除旧的 Google App Engine 版本实例?(How to automatically delete old Google App Engine version instances?)
    问题 我正在尝试以更具成本效益的方式来部署我的 Rails 应用程序,并浏览了 Ruby Starter Projects 以了解 Google Cloud Platform。 它几乎是完美的,而且在价格上肯定有竞争力,但我不知道如何在重新部署后自动删除旧部署的版本实例。 即:假设我运行的每个实例都有一个版本: 然后我对我的应用程序进行更改并重新部署: $ gcloud preview app deploy app.yaml worker.yaml --promote 所以现在我部署了每个实例的两个版本(因为 Google 在它们之间智能切换,我假设): 但是现在呢? 这些实例会自行关闭吗? 到目前为止,我发现摆脱它们的最好方法是从教程的删除项目页面: 删除应用程序版本您可以在版本页面中找到您的应用程序版本列表。 要删除非默认版本,请选中复选框,然后单击删除。 Google App Engine 上的每个人都只是手动删除了他们应用程序的旧部署吗? 回答1 要停止所有模块的所有非默认版本的所有实例(独立于这些模块使用的语言),您可以使用modules API 添加一个用 Python 编写的小型control模块: from google.appengine.api.modules import modules # core logic (inside a cron or other
  • 程序集命名和版本控制的最佳做法?(Best practices for assembly naming and versioning?)
    问题 我正在寻找有关命名程序集和对其进行版本控制的一些好的做法。 您多久增加一次主要版本或次要版本? 在某些情况下,我已经看到发行版本从1.0版本直接发展到3.0。 在其他情况下,它似乎停留在1.0.2.xxxx版本上。 这将用于公司中多个项目中使用的共享装配。 期待一些好的投入。 回答1 Suzanne Cook在MSDN上的博客(发布于2003-05-30)上的这篇文章提供了一些不错的信息: 何时更改文件/程序集版本首先,文件版本和程序集版本不需要相互一致。 我建议文件版本随每次构建而更改。 但是,请勿仅更改每个内部版本的程序集版本,以使您可以分辨出同一文件的两个版本之间的区别; 为此使用文件版本。 在决定何时更改程序集版本时,需要考虑一些构建类型的讨论:运输和非运输。 非运输版本通常,我建议在出厂版本之间使非装运程序集版本保持相同。 这样可以避免由于版本不匹配而引起的名称广泛的程序集加载问题。 有些人喜欢使用发布者策略来重定向每个版本的新程序集版本。 对于非运输版本,我建议不要这样做:它不能避免所有的加载问题。 例如,如果合作伙伴x复制了您的应用程序,则他们可能不知道要安装发布者策略。 然后,即使它们在您的计算机上正常运行,您的应用程序也会被它们破坏。 但是,如果在某些情况下同一台计算机上的不同应用程序需要绑定到程序集的不同版本,则我建议为这些程序生成不同的程序集版本
  • gcloud app deploy 不会删除以前的版本(gcloud app deploy does not remove previous versions)
    问题 我在 Google App Engine 上运行 Node.js 应用程序,使用以下命令部署我的代码: gcloud app deploy --stop-previous-version 我想要的行为是终止所有运行以前版本的实例,但它们似乎总是存在。 有什么我想念的吗? 我意识到他们没有收到流量,但我仍在为他们付费,他们会造成一些背景遥测噪音。 有没有更好的方法来运行这个命令? gcloud app instances list示例输出:如您所见,我正在运行两个不同的版本。 回答1 我们意外地在不到 30 天的时间内耗尽了我们的免费 G​​oogle App Engine 积分,因为随后的部署没有清除一个错误的灵活实例。 当我们确定其原因时,它已扩展到四个基本上处于空闲状态的同时发生的实例。 tl;dr:在部署时使用--version标志来指定版本名称。 下次部署时将替换具有相同版本的现有实例。 这让我--stop-previous-version 。 这是我到目前为止发现的: --stop-previous-version似乎不再受支持。 在 gcloud 应用程序部署参考页面上的标志下提到了它,但是如果您查看列出所有标志的页面顶部,则无处可寻。 我尝试使用该标志进行部署以查看会发生什么,但似乎没有任何效果。 仍然创建了一个新版本,我仍然需要进入并手动删除旧实例。
  • 无法访问 (Java) App Engine 中的静态文件(Static files in (Java) App Engine not accessible)
    问题 示例文档说,您只需要将文件放在war /(或子目录)中,就可以从主机上访问它们(只要它们不是JSP或WEB-INF)。 例如,如果将foo.css放置在war /中,则应该可以从http:// localhost:8080 / foo.css进行访问。 但是,这根本不适合我。 我的静态文件都无法访问。 appengine-web.xml上的文档说,您还可以专门将某些类型表示为静态。 我也尝试过,这没有区别。 我缺少明显的东西吗? 更新:事实证明,我的web.xml中的其中一个映射有点过于激进。 罪魁祸首如下: <servlet> <servlet-name>Main</servlet-name> <servlet-class>MainServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Main</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> 似乎它抓住了所有未被抓住的东西,成为其他规则之一,我不明白,因为url模式的末尾没有*。 它也似乎与说明以下内容的文档直接矛盾: 注意:静态文件(逐个提供给用户的文件,例如图像,CSS或JavaScript)与部署描述符中提到的路径分开处理。
  • 「数据库架构」三分钟搞懂事务隔离级别和脏读
    重要要点仅凭ACID或非ACID来思考,还需要知道数据库支持的隔离级别。标榜为“最终一致”的某些数据库可能返回与任何时间点不一致的结果。一些数据库提供的隔离级别比您要求的更高。脏读会导致您看到同一记录的两个版本,或者完全错过一条记录。在单个事务中多次重新运行查询时,可能会出现幻像行。最近,当开发人员David Glasser了解MongoDB默认执行脏读的糟糕方式时,MongoDB再次成为Reddit的佼佼者。在本文中,我们将解释什么是隔离级别和脏读以及如何在流行的数据库中实现它们。在ANSI SQL中,有四个标准隔离级别:可序列化,可重复读取,已提交读取和未提交读取。许多数据库的默认设置为“读取已提交”,它仅保证在进行该事务时您不会看到过渡中的数据。它通过在读取期间短暂地获取锁来实现此目的,同时保持写入锁直到事务被提交。如果您需要在一个事务中多次重复相同的读取操作,并且想要合理地确定它总是返回相同的值,则需要在整个持续时间内保持读取锁定。使用“可重复读取”隔离级别时,将自动为您完成此操作。我们说“可重复读”是“合理肯定的”,因为可能存在“幻读”。使用where子句(例如“ WHERE Status = 1”)执行查询时,可能会发生幻像读取。这些行将被锁定,但是没有什么阻止添加符合条件的新行。术语“幻像”适用于第二次执行查询时出现的行。为了绝对确保同一事务中的两次读取返回相同的数据
  • 「数据库架构」三分钟搞懂事务隔离级别和脏读
    重要要点仅凭ACID或非ACID来思考,还需要知道数据库支持的隔离级别。标榜为“最终一致”的某些数据库可能返回与任何时间点不一致的结果。一些数据库提供的隔离级别比您要求的更高。脏读会导致您看到同一记录的两个版本,或者完全错过一条记录。在单个事务中多次重新运行查询时,可能会出现幻像行。最近,当开发人员David Glasser了解MongoDB默认执行脏读的糟糕方式时,MongoDB再次成为Reddit的佼佼者。在本文中,我们将解释什么是隔离级别和脏读以及如何在流行的数据库中实现它们。在ANSI SQL中,有四个标准隔离级别:可序列化,可重复读取,已提交读取和未提交读取。许多数据库的默认设置为“读取已提交”,它仅保证在进行该事务时您不会看到过渡中的数据。它通过在读取期间短暂地获取锁来实现此目的,同时保持写入锁直到事务被提交。如果您需要在一个事务中多次重复相同的读取操作,并且想要合理地确定它总是返回相同的值,则需要在整个持续时间内保持读取锁定。使用“可重复读取”隔离级别时,将自动为您完成此操作。我们说“可重复读”是“合理肯定的”,因为可能存在“幻读”。使用where子句(例如“ WHERE Status = 1”)执行查询时,可能会发生幻像读取。这些行将被锁定,但是没有什么阻止添加符合条件的新行。术语“幻像”适用于第二次执行查询时出现的行。为了绝对确保同一事务中的两次读取返回相同的数据
  • Google App Engine 逐步升级(Google App Engine upgrading part by part)
    问题 我有一个用 PHP 编写的复杂 appengine 服务,现在我想将它部分迁移到 Python。 假设我的服务有两部分: /signIn/....和/data/... 。 我只想先迁移/signIn/部分,然后再迁移/data/ 。 但是,由于我的服务很大,所以我想在 Python 中构建新的/signIn/部分,然后使用 Traffic Splitting 对这部分进行一些 A/B 测试。 我的问题是流量拆分只能应用于版本,所以我的旧版本和新版本必须在同一个模块中,同一个模块意味着它们必须用相同的语言编写(我在这里错了,请参阅更新部分) 。 但我正在从 PHP 迁移到 Python。 对我来说最好的解决方案是什么? 谢谢, 解决方案 在 Dan Cornilescu 的帮助下,这就是我所做的: 将应用程序拆分为 2 个模块:默认和旧版本。 将/signIn/到默认模块,其余分配到旧版本模块。 在 Python 中制作另一个版本的/signIn/ (默认模块) 配置流量拆分以缓慢增加 Python 部分的请求百分比。 这将使我们能够进行测试并确保没有发生严重的错误。 注意: /signIn/部分必须是默认模块,因为 GAE 的流量拆分仅适用于默认模块。 我确认我们可以为一个模块制作 2 个不同语言的版本。 回答1 一种可能的方法是在第一步中将您的 PHP 应用程序拆分为模块。
  • mysql技术5--存储引擎
    文章目录 一.存储引擎简介1.简介2.功能了解3.存储引擎介绍4.存储引擎应用实例5.InnoDB 存储引擎核心特性说明6.InnoDB和MyISAM存储引擎的替换7.存储引擎的查看7.1 查看存储引擎设置7.2 查看表存储引擎状态 8.存储引擎的修改8.1 修改存储引擎8.2 整理碎片8.3 批量替换多张表 9.InnoDB存储引擎物理存储结构9.1 最直观的存储方式9.2 表空间(Tablespace)9.2.1 表空间数据问题9.2.2 共享表空间(ibdata1~N)9.2.3 独立表空间9.2.4 最终结论9.2.5 独立表空间设置问题9.2.6 独立表空间迁移9.2.7应用 10.InnoDB 核心特性10.1 事务10.1.1 事务的ACID特性10.1.2 事务的生命周期10.1.3 自动提交机制(autocommit)10.1.4 隐式提交的情况 10.2 事务的ACID如何保证10.2.1 一些概念名词10.2.2 事务日志-- redo 重做日志10.2.3 undo10.2.4 锁10.2.5 隔离级别 二.InnoDB核心参数的介绍 一.存储引擎简介 1.简介 相当于Linux文件系统,只不过比文件系统强大 2.功能了解 数据读写 数据安全和一致性 提高性能 热备份 自动故障恢复 高可用方面支持 等. 3.存储引擎介绍 (记住2,3个) show
  • Zookeeper 运维实践手册
    Zookeeper是一个高可用的分布式数据管理与协调框架,该框架能很好地保证分布式环境中数据一致性。一般用来实现服务发现(类似DNS),配置管理,分布式锁,leader选举等。一、生产环境中Zookeeper安装部署规范生产环境建议zookeeper至少为三台集群,统一安装配置,版本号为近期新版本,比如版本为3.4.8部署路径:/opt/业务模块名/zookeeper配置文件:/opt/业务模块名/zookeeper/conf/zoo.cfg存储快照文件snapshot的目录:/opt/业务模块名/zookeeper/data事务日志输出目录:/var/log/业务模块名/zookeeper运行日志输出目录:/var/log/业务模块名/zookeeperZookeeper所有端口需要提前开通防火墙入站规则对外服务端口:默认2181,可自定义通信端口:2888,可自定义选举端口:3888,可自定义autoperge默认关闭,建议自行编写脚本在业务低谷期清理快照和事务日志查询状态:sh /opt/业务模块名/zookeeper/zkServer.sh status启动服务:sh /opt/业务模块名/zookeeper/zkServer.sh start停止服务:sh /opt/业务模块名/zookeeper/zkServer.sh stop配置文件conf/zoo.cfg示例如下
  • 如何在phonegap项目中添加应用程序图标?(How to add app icon within phonegap projects?)
    问题 我使用默认的config.xml创建了一个新的phonegap(v 3.0.0-0.14.0)项目,然后添加了iOS和Android平台。 该配置包含所有平台图标的所有路径。 我已经覆盖了iOS和Android的默认图标,因此路径和名称仍与这些png相匹配。 在模拟器中运行时,图标不会显示。 我在xCode中进行了查找,它告诉我图标的“ Resources”文件夹仍然包含phonegap默认图标。 与Android相同。 我究竟做错了什么? 如何通过phonegap为iOS和Android添加自定义应用程序图标? 谢谢 我的config.xml <icon src="icon.png" /> <icon gap:density="ldpi" gap:platform="android" src="res/icon/android/icon-36-ldpi.png" /> <icon gap:density="mdpi" gap:platform="android" src="res/icon/android/icon-48-mdpi.png" /> <icon gap:density="hdpi" gap:platform="android" src="res/icon/android/icon-72-hdpi.png" /> <icon gap:density="xhdpi
  • 如何更新应用程序图标并启动图像以同时支持IOS 6和7?(How do you update the app icons and launch images to support IOS 6 and 7 simultaneously?)
    问题 我一直在摸索如何从Xcode5中发布支持同一版本中支持IOS7和IOS 6+的应用程序,并且资产(图标和启动屏幕)可以同时正确加载,并且仍然可以正确渲染IOS 6的资产。 我曾试图使IOS 6发生的主要挂断,因为在Xcode 5的GUI中甚至都不再提供“ prerendered”选项,因此仍可以使图标不加阴影或突出显示。 有什么想法可以使所有内容和图标正确呈现并支持多个OS版本吗? 安德鲁 回答1 苹果对IOS 7应用程序的要求有明确的指导原则,但是即使如此,我仍然遇到了使单个应用程序支持多个OS版本的错误。 在使其正常工作之后,我想我会指出一些在将来对我有帮助的方面,这对我有帮助。 我首先更新了整个应用程序,以完整地支持IOS 7,然后又回过头来启用了以前的版本,但此过程不是必需的。 只要确保您首先设置了正确的部署目标 设置部署目标后,Xcode5会很好地更改支持多个OS版本所需的默认资产列表。 确保以所需的分辨率和所需的文件名重新上传图标的正确版本(下面显示为IOS6-IOS7支持) 对启动映像执行相同的操作,请注意,您必须将启动映像重命名为新名称,如果允许,Xcode会尝试为您执行此操作。 请注意下面的新尺寸,因为IOS7会在状态栏后面展开启动图像背景。 最后,在下面手动添加两个.plist标志,应将您的图标设置为在IOS版本之间一致地呈现,并且没有光泽(解释如下)
  • 如何更改从/ usr / libexec / java_home返回的Mac OS的默认Java VM(How can I change Mac OS's default Java VM returned from /usr/libexec/java_home)
    问题 (不确定是否应该在SU上进行...迁移当然是一种选择,但是更多的程序员在这里阅读了问题,所以就去了)。 我正在运行Mac OS X 10.8.4,并且安装了Apple的JDK 1.6.0_51以及Oracle的JDK 1.7.0_25。 我最近为一些需要它的预发行软件安装了Oracle 1.8预览JDK。 现在,当我运行/ usr / libexec / java_home时,我得到了: $ /usr/libexec/java_home -V Matching Java Virtual Machines (4): 1.8.0, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home 1.7.0_25, x86_64: "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home 1.6.0_51-b11-457, x86_64: "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home 1.6.0_51-b11-457, i386: "Java SE 6" /System/Library
  • mongodb的存储引擎
    mongodb版本为3.4mongodb存储引起的一些概述存储引擎是MongoDB的核心组件,负责管理数据如何存储在硬盘和内存上。从MongoDB 3.2 版本开始,MongoDB 支持多数据存储引擎,MongoDB支持的存储引擎有:WiredTiger,MMAPv1和In-Memory。从mongodb3.2开始默认的存储引擎是WiredTiger,3.3版本之前的默认存储引擎是MMAPv1,mongodb4.x版本不再支持MMAPv1存储引擎。MongoDB不仅能将数据持久化存储到硬盘文件中,而且还能将数据只保存到内存中;In-Memory存储引擎用于将数据只存储在内存中,只将少量的元数据和诊断日志(Diagnostic)存储到硬盘文件中,由于不需要Disk的IO操作,就能获取索取的数据,In-Memory存储引擎大幅度降低了数据查询的延迟(Latency)WiredTiger存储引擎从mongodb3.2开始mongodb默认支持WiredTiger存储引擎,对于3.2之前的版本可以使用参数指定存储引擎。storage: engine: wiredTiger wireTiger: [存储引擎的参数设置]WiredTiger是各种操作应用的理想选择,因此是MongoDB的默认存储引擎。它应该是所有新应用程序的起点,除了您需要内存或加密存储引擎的特定功能的情况
  • Mysql数据库基础及linux上的三种安装方式
    数据库基础安装Mysql管理数据库和表用户和权限管理函数和存储过程Mysql架构存储引擎服务器选项系统和状态变量优化查询和索引管理锁和事务管理日志管理备份还原Mysql集群一、基础概念【数据库发展史】文件系统——使用磁盘文件来存储数据第一代数据库——网状模型、层次模型第二代数据库——关系型数据库和结构化查询语言新一代数据库——"关系-对"型数据库文件系统:编写应用程序不方便,数据冗余不可避免、不支持对文件的并发访问、数据间联系弱、可视化效果差、无安全控制功能】 数据库管理系统DBMS:相互关联的数据的集合、较少的数据冗余、程序域数据相互独立、数据的安全性、可靠、数据可以并发使用【数据库管理系统】数据库是数据的汇集,它以一定的组织形式存于存储介质上DBMS是管理数据库的系统软件,他实现数据库系统的各种功能,是数据库系统的核心DBA工程师:负责数据库的规划、设计、协调、维护和管理等工作应用程序:指以数据库为基础的应用程序数据库管理系统基本功能数据定义:数据处理:增、删、查、改数据安全:数据备份:还原!!!数据库系统的架构单机架构大型机/终端架构主从式架构(C/S):主流分布式架构【关系型数据库,(非关系型数据库,性能更好(no SQL 、not only SQL、memcached redis))】关系:二维表行ROW:一条记录,record记录列Column:属性、字段主键
  • Java 7和Java 8之间四舍五入的不一致是否是一个bug?(Is inconsistency in rounding between Java 7 and Java 8 a bug?)
    问题 我在Java 7和Java 8之间的DecimalFormat类中四舍五入时发现不一致。这是我的测试用例: DecimalFormatTest.java import java.text.DecimalFormat; public class DecimalFormatTest { public static void main(String[] args) { DecimalFormat format = (DecimalFormat) DecimalFormat.getInstance(); format.setDecimalSeparatorAlwaysShown(true); format.setMinimumFractionDigits(1); format.setMaximumFractionDigits(1); System.out.println(format.format(83.65)); } } 在Java TM SE运行时环境(内部版本1.7.0_51-b13)中,输出为: 83.6 在Java™SE运行时环境(内部版本1.8.0-b132)中,输出为: 83.7 这是回归错误吗? 还是四舍五入规则随Java 8的发布而改变了? 回答1 看来这是JDK 7中一个长期存在的错误,该错误终于得到修复。 参见例如: https://bugs.openjdk
  • App Engine:部署时未更新静态文件(App Engine: Static Files Not Updating on Deploy)
    问题 我使用以下设置推送了一个包含 Angular SPA 的 HTML 静态文件作为我的自定义域的全能处理程序: - url: /(api|activate|associate|c|close_fb|combine|import|password|sitemap)($|/.*) script: gae.php - url: /.* static_files: public/static/app/v248/es/app.html upload: public/static/app/v248/es/app.html expiration: "1h" 效果很好,但是如果我推送一个新的 app.html,它就不会更新。 我尝试更改本地路径,部署新的应用程序版本,甚至用自定义的 php 端点替换 catch-all 处理程序,但它不起作用,响应仍然是我上传的 app.html 的第一个版本。 其他人也遇到了同样的问题(CSS File Not Updating on Deploy (Google AppEngine)),看起来与 Google CDN 缓存有关,但据我所知,没有任何方法可以刷新它。 回答1 有一种方法可以刷新您的应用在 GCP 上缓存的静态文件。 前往您的 Google Cloud Console 并打开您的项目。 在左侧汉堡菜单下,前往存储 -> 浏览器。
  • 棒棒糖的backgroundTint对Button无效(Lollipop's backgroundTint has no effect on a Button)
    问题 我的活动中有一个按钮,我希望它具有主题的强调色。 自然,我不是要像制作棒棒糖之前那样制作自己的可绘制对象,而是自然要使用新的backgroundTint属性。 <Button android:id="@+id/btnAddCode" android:layout_width="match_parent" android:layout_height="wrap_content" android:backgroundTint="@color/accent" android:text="@string/addressInfo_edit_addCode" /> 不幸的是,它没有任何作用,按钮保持灰色。 我为backgroundTintMode尝试了其他值,但没有任何改变。 我还尝试在“活动”中以编程方式进行此操作,但没有做任何更改。 addCodeView.findViewById(R.id.btnAddCode).setBackgroundTintList( getResources().getColorStateList(R.color.accent)); 为什么我的色彩被忽略? 编辑:只是为了澄清,我确实在棒棒糖设备上进行测试。 其他窗口小部件(例如EditText)已正确并自动着色。 回答1 在API 19至API 27上进行了测试 <?xml version="1.0"