【问题标题】:Connection pool for dynamic database connections动态数据库连接的连接池
【发布时间】:2015-08-09 07:39:27
【问题描述】:

问题设置基于 Web 服务(Spring/Java、Tomcat7 和 MySql),每个用户都有自己的数据库,因此每个请求都需要自己的连接。由于所有数据库都是在运行时动态创建的,因此不能在启动前对其进行静态配置。

为了优化数据库连接使用,数据库连接池的实现会很棒,对吧?

使用 Java/Spring:如何为动态数据库创建连接池?我对这里缺少 clean 选项感到有点震惊!

问题Tomcat's Connection Pool(据我所知C3P0)将每个新的 DataSource 实例视为一个全新的连接池 -> stack-reference

  1. 创建一个带有通用 MySql 连接的静态数据源(不指定连接的数据库)并将连接池与该数据源一起使用以及经过调整的 SQL 语句是否是个好主意?
    stack-reference
  2. 如何开发基于自定义持久数据库的数据源池?有没有在这里表演的经验?有什么建议吗?有没有这样做的库?
  3. 或者通过从 Java 动态操作其 context.xml 来动态创建 Tomcat JNDI 数据源来解决 Tomcat 的数据源问题是否可行?
  4. 我不敢相信没有更多的简单/简单解决方案。 Grails/Hibernate 在这方面苦苦挣扎,Java/JDBC 在这方面苦苦挣扎,......通过动态创建用户特定的数据库来基于用户分离用户数据是一种罕见的用例吗?如果是这样,什么是更好的设置?

编辑

  1. 另一个选项是来自@M.Deinum 的建议,即使用单个配置的数据源并动态热交换它以获得正确的连接 ->M.Deinum Blogstack-reference
    使用类似的连接池如何执行上面?

【问题讨论】:

  • 不确定 hibernate 是如何解决这个问题的,因为它是开箱即用的多租户支持,这基本上是你想要的。
  • 想举个例子吗?很高兴看到一个可行的解决方案!我对休眠多租户支持的经验让我明白,数据源在启动之前仍然必须存在/配置。如何在没有此类数据源的情况下使用休眠并动态创建连接?
  • 是的,我什至在多租户成为一件事之前就有经验,我blogged 也对此有所了解。它适用于前端、后端或数据源......我们用一个应用程序实例替换了 50 个应用程序实例......在 2006 年......(稍后在博客中介绍)。
  • 好的,感谢休眠帮助!也感谢您的博客条目!在您的博客中,您描述了一个使用 HotSwappableTargetSources 的解决方案。这不是上述选项(1-3)的变体吗?这对于无状态 REST 和连接池有何表现?
  • 在有数千个并发用户的情况下非常好 :)... 但如前所述,那是在多租户流行之前。我建议先尝试可用的,然后再尝试自己的。 (我们需要的不仅仅是hibernate,比如模板网站,为此我们集成了Springs Theming支持)。

标签: java mysql tomcat jdbc connection-pooling


【解决方案1】:

我相信HikariCP 无需指定单个数据库即可工作。

【讨论】:

    【解决方案2】:

    在运行时创建数据库后,您还必须在运行时创建池。恐怕 spring 基础设施在这里没有给你任何帮助,因为它针对通常的静态用例进行了调整。

    我有一张游泳池地图:

    • 有一个
      地图>地图
    • 请求连接时,从map中获取对应的c3po池
    • 您可以两全其美,因为每个动态创建的数据库的真实连接池由 c3po 实例处理,但您可以在运行时创建新实例

    这是一种低级解决方案。如果您想更进一步,可以将此逻辑包装到数据库连接提供程序中,并将其注册为“驱动程序”。这样,您的应用程序的任何部分都请求新连接,您只需从现有池中返回一个连接(如果请求全新的连接,请为此创建一个新池)。

    【讨论】:

      【解决方案3】:

      首先,对不起我的英语,我每天都在进步。

      根据我的经验,我也遇到过类似的情况,可以通过 spring 框架解决。让我解释一下你将如何解决这个问题。

      1. 制作一个具有以下特征的 spring 配置文件: a) 资源加载器:该加载器负责从配置文件或数据库加载属性,这些属性将适合建立数据库连接。 b) 使用您将加载的属性参数化的池数据库配置。

      2. 创建一个定位器类:在这个类中你需要一个 HashMap

      3. 使用 spring 的多上下文特性:这个想法是为您建立的每个连接分配一个代码,然后像使用 spring 的应用程序上下文一样加载该连接,然后在定位器类中,放入映射上下文并根据需要尽可能频繁地使用它。

      我想如果你按照这些步骤,你可以根据需要创建动态池或数据库连接。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-09
        • 1970-01-01
        • 2015-06-27
        • 1970-01-01
        • 2010-10-23
        • 1970-01-01
        • 2011-05-28
        • 2012-04-06
        相关资源
        最近更新 更多