当前位置: 首页 > 知识库问答 >
问题:

在spring中,我如何拥有一个不是bean的数据源对象?

何麻雀
2023-03-14

这听起来可能很奇怪。但我想知道如何/是否可以在运行时而不是容器启动时创建数据源对象。

以下是我正在解决的问题:

我有一个MySql数据库,它存储我需要连接并进行夜间处理的其他SQL服务器的URL、用户名和密码。此SQL Server列表每次都会更改。因此不能在属性文件中硬编码。此外,SQL Server的数量约为5000个或更多。

业务逻辑涉及读取MySQL数据库(当前是在容器启动期间创建的数据源bean),对于MySQL数据库中SQL\u SERVER\u映射表中的每个条目,我需要连接到该数据库并运行报告。

我在考虑为每个SQL服务器实例做一些事情

public DataSource getdataSource(String url, String u, String p, String class) {
    return DataSourceBuilder
        .create()
        .username(u)
        .password(p)
        .url(url)
        .driverClassName(class)
        .build();
}

public JdbcTemplate jdbcTemplate(DataSource datasource) { 
        return new JdbcTemplate(dataSource); 
    } 

下面是一个生成器,它为给定的url生成数据源,并从中创建必要的jdbcTemplate。因此,基本上为每个SQL server配置创建一个。我担心的是,我将创建大约5000个数据源和5000个jdbcTemplate,甚至更多。我觉得这不太合适。到这里来的正确方法是什么?

有没有办法在我处理完数据源对象后立即将其删除或回收?

我应该在我的Spring应用程序中缓存这些dataSource对象,这样我就不必每次都创建一个并丢弃它。但这意味着,我需要缓存5000个(或者将来可能更多)。

Spring文档说

数据源应始终配置为Spring IoC容器中的bean。在第一种情况下,bean直接提供给服务;在第二种情况下,它是给准备好的模板。

所以这让我很难接受。

谢谢

共有1个答案

巫马磊
2023-03-14

您可以使用范围原型定义一个bean myBean,并使用BeanFactory的getBean(String name, Object... args)方法。args将是发送到构造函数的args(在您的情况下,这些将是数据库连接)。bean将返回一个jdbcTemplate,该模板使用从连接属性定义的数据源构造。此模板可以进一步用于其他类。

由于bean的作用域是原型,创建的实例将在使用当前对象后被垃圾收集。如果您有内存限制,这会有所帮助,在获取实际的数据库连接时,创建对象的真正繁重工作就完成了。如果连接被大量重用,缓存将是一个很好的解决方案。

在此处查看此bean和方法用法的示例:具有动态构造函数值的Spring bean

 类似资料:
  • 我的目标是使用Spring创建一个Webserver。它必须实现Multitenancy,如果您不使其动态(添加、删除、更改),它会很好地工作。是否可以在Spring中更新数据源bean? 我的代码: 我试过的: 它更新bean(?)但不更新Spring的数据源,如果使用此方法添加,数据库连接仍然缺失。

  • 我想测试一个注入数据源bean的类,但我不知道如何模拟bean数据源(我没有类,只有bean配置)。我的班级是这样的: 我的豆子:

  • 有一个应用程序需要像搜寻列表这样的东西。这个应用程序可以用不同的配置多次启动。有没有办法跨JVM共享数据结构。在JVM中是有效的。有一个数据库可以解决这个问题。但是,有没有更简单、更快速的方法?

  • 我正在连接多个数据源,但有时某些数据源可能处于脱机状态,此时我在应用程序上遇到错误,应用程序在启动时失败。 我想在启动时跳过数据源配置...我已经尝试了几种方法 application.properties,我也试着添加 到主类,但它仍然试图配置数据源。 我还尝试在所有方法和构造函数上使用@Lazy注释,如下所示,但在创建efEntityManagerFactory时仍然出错 对于不同数据源的不同

  • 我有一个Google Cloud函数,它包含多个模块,可以在不同的路径上调用。 我正在使用无服务器框架来部署我的函数,但它有每个函数只有一个路径的限制。 我想在一个函数中使用多个路径,就像我们可以在AWS无服务器框架中一样。 假设云函数有两个路径和;两个路径都应该调用相同的函数。 类似这样的事情:

  • 问题内容: 这就是我在1到6之间生成唯一编号并从drawable文件夹中获取适当图像的方式。 我想要的是,我必须调用此方法7次,并且每次此方法应返回唯一的随机数。因此,所有已选择的数字都不会再次出现。 问题答案: 解决此类问题的常用方法是创建一个包含每个可能值的列表,并对其进行混洗(使用Collections.shuffle)。然后,每当您需要一个值时,便从列表中消费一项。这将确保您不会多次使用相