共享数据库连接与私有数据库连接

时间:2010-07-29 09:17:15

标签: java postgresql

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

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

*)单一/共享连接:

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

*)私人连接:

  • (+)专业人士
    • 交易没问题:)
  • ( - )缺点:
    • 可能需要大量的并发连接,即如果有10000个在线用户,则需要10000个数据库连接,这似乎是太高的数量:)虽然我对预期的用户数量一无所知,我们仍在研究和规划过程中。

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

另一个解决方案是将查询分组为两个“类型” - 一种可以安全地使用单个共享长生命连接的类型(例如,“更新用户设置last_visit = now(),其中id =:user_id”),另一种需要私人短生活联系的类型(例如,可能会做一些繁重工作或使用交易的东西)。这个解决方案对我来说似乎并不吸引人,但如果这是应该做的,我可以尝试这样做......

那么......其他开发者在这种情况下做了什么?还有其他合理的解决方案吗?

2 个答案:

答案 0 :(得分:8)

我不使用长期连接。我使用连接池来管理连接,并且只在执行操作时保留它们:获取连接,执行我的SQL操作,返回到池的连接。它更具可扩展性,不会遇到交易问题。

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

答案 1 :(得分:2)

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

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