解决一次既要又要的生产问题-如何看待Spring中的延迟加载?——实战案例分享

Dcr 1年前 ⋅ 989 阅读

报表工程发版启动失败,经过排查,发现其中一个员工魔方的数据源的数据库被移除了。为了避免这种情况影响主要业务的运行,我们采取了对非主流程的数据源延迟加载的方案。但在实际实现中,我们遇到了一些问题。

起初我们尝试对 dasuanSqlSessionFactory bean 进行延迟初始化,将 lazy-init 属性设置为 true,但是发现该方法并没有生效。经过进一步排查,我们发现在项目启动过程中日志拦截器需要对所有的 SqlSessionFactory 添加日志配置处理,所以无法通过bean延迟初始化解决这个问题。

所以我们换了一个方案,对 DataSource 连接池进行处理,将连接池的初始化连接数设置为 0,让 SqlSessionFactory bean 正常加载,但不去访问数据库连接,从而实现了延迟加载。

如果您在开发 Spring 应用程序时需要延迟加载 bean,可以考虑设置 lazy-init 属性为 true。但请注意,如果一个 bean 被其他 bean 所依赖,它可能无法被延迟初始化。在这种情况下,您可以采取其他方法来实现延迟加载,例如对数据源连接池进行处理,这样可以避免影响应用程序的性能和效率。

虽然将连接池的初始化连接数设置为 0 可以实现延迟加载,但是这种方法可能会存在一些坏处。由于连接池没有初始化任何连接,当第一次需要连接时,应用程序需要花费额外的时间来创建新的连接。这可能会导致一些性能瓶颈,特别是在应用程序需要频繁连接数据库时。此外,将连接池的初始连接数设置为 0 可能会影响应用程序的可伸缩性。当应用程序需要连接更多的数据库时,如果连接池没有足够的连接可用,应用程序可能会出现连接超时或失败的情况,导致应用程序崩溃。因此,在使用此方法时,应谨慎考虑其可能带来的影响,并根据实际情况调整连接池的配置。如果您需要连接数据库的频率较高,并且应用程序需要在高并发环境下运行,您可能需要将连接池的初始连接数设置为一个适当的值,以确保应用程序的性能和可伸缩性。

全部评论: 0

    我有话说: