【问题标题】:Opening mysql connection on per workstation basis基于每个工作站打开 mysql 连接
【发布时间】:2011-07-06 08:41:58
【问题描述】:

由于我对问题的解释似乎不够清楚,让我再试一次。

设置:
我们拥有的 Web 应用程序使用单个 mySQL 用户连接到数据库,这或多或少是经典的方法。为避免混淆,我将 mysql 用户称为 sqluser,将登录到 Web 应用程序的用户简称为 users。现在,用户从他们的工作站登录到 Web 应用程序,工作站可以是台式机或笔记本电脑(主要是笔记本电脑)。

场景:
我将使用我们 Web 应用程序中的报告模块来说明问题。当用户向系统请求报表时,我们使用临时表来拉取、处理和格式化数据——php 接收准备好的结果集来显示,php 端不进行任何数据处理。问题是临时表或多或少是在 mysql 连接之间随机共享的,这使我们相信其中一些连接被重用了。这是不可接受的,因为两个用户生成相同的报告(但说来自不同的时间范围)会覆盖彼此的临时表。

目前,我们通过事务克服了这个问题:每个报告请求都包装在一个事务中 - 在其中创建和删除临时表,使它们对并行或重用连接透明。

我们想要什么:
我们希望每个不共享临时表的用户/工作站都有一个新的非共享连接。换句话说,我们希望为每个连接到 DB 的用户建立一个新的 mysql 连接,该连接将保留其临时表,但不会在与不同用户的并行连接之间共享它们。

可能的解决方案:
是为每个 Web 应用程序用户创建一个匹配的 sqluser,并将此 sqluser 用于给定用户的 DB 连接。由于此解决方案提供了额外的复杂性(管理 sqluser 与用户的匹配),我宁愿这不是首选。

问题:
我们能否以某种方式强制 mysql 在每个用户/工作站的基础上打开不会跨连接池共享临时表的 mysql 连接?是否有框架(php 或 python)可以开箱即用地提供这样的功能?

我希望这个解释比原来的解释清楚一点。


原文:

是否可以打开mysql 基于每个工作站的连接 登录同一个mysql时 用户?

以下是场景:我们的 webapp 有正在使用连接到 mysql 单个 mysql 用户,是什么让 mysql 重用打开的连接,有什么好处 到一个点。问题开始于我们 需要创建临时表 每台机器的基础。目前, 解决方法是使用事务和 之后删除临时表, 但我们希望它们可以重复使用 在工作站的会话内(在 webapp 用户上下文)。

另一种解决方案是创建 每个 webapp 用户的 mysql 用户和 在该用户上打开连接 登录。但是你必须管理 不断的旋转和匹配 mysql 用户到 webapp 用户。

相反,我们想以某种方式强制 mysql 每次打开新连接 webapp 用户,或者使用 工作站的内部 IP、macaddress、 等等。任何人都知道这是否是偶数 可能吗?

我们正在计划重写这个 webapp从头开始,所以基本上甚至 真正深刻的变化是可能的 这一点,因此问题。 也许有 php(或 python) 可以实现这一点的框架 开箱即用?

【问题讨论】:

    标签: php mysql database-connection


    【解决方案1】:

    MySQL 文档非常清楚地解决了您的问题:

    TEMPORARY 表仅对当前连接可见,并在连接关闭时自动删除。这意味着两个不同的连接可以使用相同的临时表名称而不会相互冲突或与现有的同名非临时表。 (在删除临时表之前,现有表是隐藏的。)要创建临时表,您必须具有 CREATE TEMPORARY TABLES 特权。 笔记 如果您使用 TEMPORARY 关键字,CREATE TABLE 不会自动提交当前活动事务。

    来源:http://dev.mysql.com/doc/refman/5.5/en/create-table.html

    是什么导致您假设 tmp 表在多个连接之间共享?

    当你连接到数据库时

    • 每个 (HTTP) 请求都会打开一个新连接
    • 一旦 php 垃圾收集开始发挥作用,每个 (HTTP) 请求都会关闭连接

    除非

    • 您使用的是持久连接,我一般不推荐这样做
    • 可能与最新 MySQL 版本中新增的连接池相同。我不确定服务器如何处理会话隔离

    【讨论】:

      【解决方案2】:

      如果我的理解正确,您希望该设施(实际上)拥有一个临时表,其范围不仅是当前会话,还包括该用户和客户端地址的所有会话。如果是这样,打开更多连接与问题无关。你需要重写 mysqld 来适应这个!

      是什么让 mysql 重用打开的连接

      否 - 仅当您使用连接池/持久连接时。

      目前的解决方法是使用事务

      这意味着临时表的结构数量是有限的——如果是这种情况,为什么不直接创建这些带有附加列(由触发器填充?)来保存用户名的永久表?然后,如果您真的想学究气,请阻止对表的 SELECT 访问并强制用户从过滤用户名的视图中检索数据。

      也许有 php(或 python)框架可以实现这个开箱即用?

      erm...不 - 除了不可能的事实之外,实施管理数据库内部数据结构的逻辑形式也是错误的地方。

      另一种解决方案是为每个 webapp 用户创建 mysql 用户,并在登录时打开该用户的连接。但是你必须管理 mysql 用户与 webapp 用户的不断轮换和匹配。

      如果这是一个潜在的解决方案,那么你没有很好地解释问题。

      听起来您正在尝试模拟事务跨越多个页面请求(因此跨越多个 mysql 会话)的行为。在这种情况下,数据库临时表与任何可行的解决方案无关。

      【讨论】:

      • “如果这是一个潜在的解决方案,那么你没有很好地解释问题”:请重新阅读问题 - 我希望这次更清楚:)跨度>
      • 您似乎确实解释了问题 - 您提出的解决方案不可行。使用非临时表来存储您的中间结果。
      • 为什么会这样? mysql中不同的sqluser不共享临时表(因为这是主要问题),所以看起来可行。
      猜你喜欢
      • 2010-10-10
      • 1970-01-01
      • 2017-01-05
      • 2020-04-04
      • 1970-01-01
      • 2014-07-24
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多