基于每个工作站打开mysql连接

时间:2011-07-06 08:41:59

标签: php mysql database-connection

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

设定:
我们使用的Web应用程序使用单个mySQL用户连接到DB,这或多或少是经典的方法。为了避免混淆,我将把mysql用户称为 sqluser ,并将用户只需用户登录到Web应用程序。现在,用户可以从他们的工作站登录到Web应用程序,这些工作站可以是台式机或笔记本电脑(主要是笔记本电脑)。

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

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

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

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

问题:
我们可以以某种方式强制mysql在每个用户/工作站上打开mysql连接,不会在连接池中共享临时表吗?那里有一个框架(php或python),它具有开箱即用的功能吗?

我希望这个解释比原版更清晰。


原文:

  

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

     

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

     

另一种解决方案是创造   每个webapp用户的mysql用户和   打开该用户的连接   登录。但是你必须要管理   不断轮换和比赛   mysql用户到webapp用户。

     

相反,我们想以某种方式强迫   mysql打开新的连接   webapp用户,要么使用   工作站的内部IP,macaddress,   有人知道这是否均匀   可能的?

     

我们正计划改写这个   webapp从头开始,所以基本上都是   真正的深刻变化是可能的   这一点,因此问题。   也许有php(或python)   可以实现这一目标的框架   外的现成?

2 个答案:

答案 0 :(得分:1)

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

  

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

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

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

连接数据库时

  • 每个(HTTP)请求将打开一个新连接
  • 每次(HTTP)请求将在php垃圾收集发挥作用后关闭连接

<强>除非

  • 您正在使用持久连接,我通常不建议
  • 可能与最新MySQL版本中新增的连接池相同。我不确定服务器如何处理会话隔离

答案 1 :(得分:0)

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

  

是什么让mysql重用开放连接

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

  

目前解决方法是使用交易

这意味着临时表的结构数量有限 - 如果是这种情况,为什么不创建这些永久表是否具有附加列(由触发器填充?)来保存用户名?然后,如果你真的想要迂腐,阻止对该表的SELECT访问并强制用户从过滤其用户名的视图中检索数据。

  

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

呃...没有 - 除了不可能的事实之外,管理数据库内部数据结构的逻辑形式是错误的。

  

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

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

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