2011-07-06 33 views
1

由于我对问题的解释似乎还不够清楚,所以让我再试一次。在每个工作站的基础上打开mysql连接

设置:
我们有Web应用程序使用单一的MySQL用户连接到数据库,更重要的是以下经典的方法。为了避免混淆,我将把mysql用户称为sqluser,并且将用户登录到web应用程序,只需用户。现在,用户可以从他们的工作站登录到Web应用程序,这些工作站可以是台式机或笔记本电脑(主要是笔记本电脑)。

场景:
我将使用我们的Web应用程序中的报告模块来说明问题。当用户从系统请求报告时,我们使用临时表来拉取,处理和格式化数据 - php接收就绪的结果集来显示,没有数据处理在PHP端完成。问题在于临时表或多或少随机地通过mysql连接共享,导致我们相信某些连接被重用。这是不可接受的,因为两个用户生成相同的报告(但是从不同的时间范围说)会覆盖彼此的临时表。

目前我们克服了交易中的这个问题:每个报表请求都被包装在一个事务中 - 临时表被创建并被放入,使得它们对并行或重用连接是透明的。

我们所希望的:
我们希望每每个用户/工作站不共享临时表的新的,非共享连接。换句话说,我们希望为每个连接到数据库的用户建立一个新的mysql连接,这将保留其临时表,但不会在与不同用户并行连接的情况下共享它们。

潜在的解决方案:
就是让每个Web应用程序的用户匹配sqluser并使用此sqluser对于给定的用户数据库连接。由于此解决方案提供了额外的复杂层次(管理sqlusers与用户的匹配),我宁愿这不是第一选择。

问:
我们能否以某种方式强制MySQL打开每个用户/工作站基础MySQL连接,不会跨越共享连接池的临时表?有没有框架(PHP或Python),那里将有这样的功能开箱即用?

我希望这个解释稍微清楚一点,然后原来。


原始文本:

是否有可能打开每个工作站的基础上的MySQL 连接 登录到同一台MySQL 用户什么时候?

这里的情景:我们 有web应用程序是使用 单mysql用户,是什么让MySQL的 重用打开的连接,什么是好 到一个点连接到MySQL。当我们 需要在每台计算机上创建基于 的临时表时,问题就开始了。目前, 解决方法是使用事务和 之后删除临时表, 但我们希望它们在工作站的会话内(在 webapp用户上下文中)可重复使用 。

另一种解决方案是创建为每个web应用用户 MySQL的用户以及在 登录在该用户 开放连接。但是,您必须管理 不断轮换,并将 mysql用户与webapp用户进行匹配。

相反,我们想以某种方式迫使 MySQL来打开每 web应用程序用户新的连接,或者使用 工作站的内部IP,MACADDRESS, 等任何人都知道,如果这是连 可能吗?

我们刨重写从头这个 web应用,所以基本上连 真正深刻的变化都可能在 这一点,因此这个问题。 也许有PHP(或Python) 框架,可以实现这个 开箱即用?

回答

0

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

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

没有 - 只有当你使用连接池/持久连接。

目前的解决办法是使用交易

诸如此类的暗示,有结构的临时表数量有限 - 如果是这样的话,为什么不创建这些都是永久表与一个额外的列(由触发器填充)来保存用户名?然后,如果您确实想要迂腐,请阻止对表格的SELECT访问,并强制用户从过滤其用户名的视图中检索数据。

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

erm ...否 - 除了事实上它不可能,它将是一个错误的地方来实现管理数据库内部数据结构的逻辑。

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

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

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

+0

*“如果这是一个潜在的解决方案,那么你已经不能解释这个问题非常好” *: 请重新阅读的问题 - 我希望这是更清晰这次:) – Maiiku

+0

看来你确实解释了这个问题 - 你提出的解决方案是不可行的。使用非临时表来存储您的中间结果。 – symcbean

+0

为什么如此?不同的sqlusers在mysql中不共享临时表(因为这是主要问题),所以它似乎可行。 – Maiiku

0

MySQL文档很清楚地解决你的问题:

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

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

是什么导致了你的假设,即TMP表多个连接之间共享?

当您连接到数据库

  • 每个(HTTP)请求将打开一个新的连接
  • 每个(HTTP)请求将关闭,一旦PHP垃圾收集连接进场

除非

  • 你是U唱持久连接,我一般不推荐
  • 可能与最新MySQL版本中新增的连接池相同。我不知道肯定服务器如何处理会话隔离