动态数据库连接的连接池

时间:2015-05-27 09:43:55

标签: java mysql tomcat jdbc connection-pooling

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

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

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

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

  1. 使用通用MySql连接创建静态数据源(不指定连接时的数据库)并使用带有此数据源的连接池以及适应的SQL语句是一个好主意吗?
    stack-reference
  2. 如何开发基于自定义持久数据库的数据源池?有表演经验吗?有什么建议?有没有这样做的图书馆?
  3. 或者通过动态地从Java动态创建Tomcat JNDI数据源来解决Tomcat的DataSource问题是否可行?
  4. 我无法相信没有更多简单/简单解决方案。 Grails / Hibernate正在努力解决这个问题,Java / JDBC正在努力解决这个问题......是否通过动态创建用户特定数据库来分离用户数据这种罕见的用例?如果是这样,那会是一个更好的设置?
  5. 修改

    1. 另一个选项是@M.Deinum建议使用单个已配置的数据源并动态热交换以获得正确的连接 - > M.Deinum Blogstack-reference
      如何做到这一点使用如上所述的连接池执行?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

在运行时创建数据库后,您还必须在运行时创建池。我担心弹簧基础设施在这里没有给你任何帮助,因为它是针对通常的静态用例而调整的。

我有一张泳池地图:

  • 有一个
     Map < connectionUrlString,List< c3poPool > > map
  • 请求连接时,从地图中获取相应的c3po池
  • 并且您可以充分利用这两个世界,因为每个动态创建的数据库的真实连接池由c3po实例处理,但您可以在运行时创建新实例

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

答案 2 :(得分:0)

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

根据我的经验,我遇到了类似的情况,并且使用spring框架解决了这个问题。让我解释一下你是如何解决这个问题的。

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

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

  3. 使用spring的多上下文功能:这个想法是为你建立的每个连接分配一个代码,然后像Spring的应用程序上下文那样加载该连接,然后在locator类中,放入地图中上下文并根据需要频繁使用。

  4. 我认为您按照这些步骤操作,可以根据需要创建动态池或数据库连接。