我怎样才能拥有一个春天不是bean的数据源对象?

时间:2016-07-21 18:26:09

标签: spring spring-mvc spring-boot spring-data-jpa

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

以下是我正在处理的问题:

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

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

我正在考虑为每个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服务器配置创建一个。 我担心的是我将创建大约5000个数据源和5000个jdbcTemplate或者甚至更多。这对我来说听起来不对。什么是在这里绕行的正确方法?

有没有办法在我完成它或回收它们后立即删除数据源对象?

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

Spring docs

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

这样会让事情变得更难。

由于

1 个答案:

答案 0 :(得分:0)

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

由于bean的范围是原型,因此在使用当前对象之后将收集所创建的实例。如果您有内存限制,这可以提供帮助,在获取实际数据库连接时,在创建对象方面真正繁重。如果重复使用连接,缓存将是一个很好的解决方案。

请在此处查看此bean和方法用法的示例:spring bean with dynamic constructor value