动态数据库连接的连接池

2022-09-04 23:11:19

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

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

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

问题Tomcat的连接池(据我所知,C3P0也是如此)将每个新的DataSource实例视为一个全新的连接池 - >堆栈引用

  1. 使用通用 MySql 连接创建静态数据源(未在连接时指定数据库)并将连接池与此数据源以及改编的 SQL 语句一起使用,这是一个好主意吗?
    堆栈引用
  2. 如何开发基于自定义持久性数据库的数据源池?这里有任何性能经验吗?有什么建议吗?有没有这样做的库?
  3. 或者,通过动态地创建Tomcat JNDI数据源来解决Tomcat的DataSource问题是否可行.xml从Java动态地操作它的上下文?
  4. 我不敢相信没有更简单明了的解决方案。Grails/Hibernate与此斗争,Java / JDBC与此斗争,...通过动态创建用户特定的数据库来在用户基础上分离用户数据是一个罕见的用例吗?如果是这样,什么是更好的设置?

编辑

  1. 另一个选项是@M.Deinum的建议,使用单个配置的数据源并动态热插拔它以获得正确的连接 - >M.Deinum博客堆栈引用
    对于像上面这样的连接池,效果如何?

答案 1

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


答案 2

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

我会有一个池地图:

  • 有一个
     Map < connectionUrlString,List< c3poPool > > map
  • 请求连接时,从地图中获取相应的 c3po 池
  • 并且您可以获得两全其美的优势,因为每个动态创建的数据库的实际连接池都由c3po实例处理,但是您可以在运行时创建新实例

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


推荐