代码之家  ›  专栏  ›  技术社区  ›  binaryLV

共享数据库连接与专用数据库连接

  •  5
  • binaryLV  · 技术社区  · 14 年前

    试图找出如何管理/使用长期存在的数据库连接。我很少有这样的经验,因为我只在小型系统(多达150个并发用户,每个用户都有自己的数据库用户/通行证,所以在任何时候都有多达150个实时数据库连接)或网页(每个页面请求都有自己的数据库连接,持续时间不到一秒钟,所以并发数据库连接的数量并不庞大。

    这次将有一个Java服务器和Flash客户端。Java连接到PostgreSQL。预期连接将是长寿命的,也就是说,当Flash客户端连接到Java服务器并在Flash客户端断开连接时,它们将启动。在所有用户(客户机)之间共享单个连接还是为每个客户机建立私有连接更好?或者其他解决方案会更好?

    *)单/共享连接:

    • (+)PROs
      • 整个系统只有一个数据库连接
    • (-)缺点:
      • 无法使用事务(例如“user1.startTransaction();user1.updateBooks();user2.updateBooks();user1.rollback();”到单个共享连接将回滚由user2完成的更改)
      • 一个用户的长时间查询可能会影响其他用户(但不确定这一点)

    *)专用连接:

    • (+)PROs
      • 事务没有问题:)
    • (-)缺点:
      • 可能需要大量的并发连接,例如,如果在线有10000个用户,需要10000个数据库连接,这似乎太多了:)但是我不知道预期的用户数量,因为我们仍在研究和规划过程中。

    一种解决方案是引入超时,即,如果15/60/900(?)不使用DB连接几秒钟后,它就会断开。当用户再次需要数据库时,它会重新连接。这对我来说似乎是一个很好的解决方案,但我想知道这可能是合理的限制,例如,什么是并发数据库连接的最大数量,应该使用什么超时等等。

    另一种解决方案是将查询分组为两种“类型”——一种类型可以安全地使用单个共享的长生存连接(例如,“update user set last_visit=now(),其中id=:user_id”),另一种类型需要专用的短生存连接(例如,可能会做一些繁重的工作或使用事务)。这个解决方案似乎对我没有吸引力,但如果这是应该做的,我可以尝试这样做…

    所以…其他开发人员在这种情况下做什么?还有其他合理的解决办法吗?

    2 回复  |  直到 14 年前
        1
  •  8
  •   duffymo    14 年前

    我不使用长久的联系。我使用一个连接池来管理连接,并且只保留它们执行操作所需的时间:获取连接,执行我的SQL操作,返回到池的连接。它的可扩展性要高得多,而且不存在事务问题。

    让容器为您管理池——这就是它的用途。

        2
  •  2
  •   Jason    14 年前

    通过使用单一连接,您也会得到非常低的性能,因为数据库服务器将只为您分配一个连接。

    你肯定需要一个连接池。如果应用程序在应用程序服务器内运行,请使用容器池。或者可以使用连接池库(如c3p0)。