-
Notifications
You must be signed in to change notification settings - Fork 38.5k
Cache by-type lookups in DefaultListableBeanFactory [SPR-6870] #11536
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
Kristian Rosenvold commented This problem is really bad if you use a lot of web-scoped beans and |
Kristian Rosenvold commented And yes, this applies to spring 3.0 too. The caching really needs to be updated to understand "by type". |
Kristian Rosenvold commented It also severely affects start-up time of your application context. About 50-75% of our application context startup-time is spent iterating the application context to determine autowire-by type. |
j w commented +1 autowiring by type is inefficient and in my profiling is taking a large percentage of the request/response time. |
Kristian Rosenvold commented There is now a workaround ! |
j w commented Thanks Kristian, My solution was not ideal, but I hope it helps you. I'm happy to contribute a patch if Spring wants it. |
Lari Hotari commented Please fix this issue. Add caching to the DefaultListableBeanFactory.getBeanNamesForType method. This is a performance hotspot for many Spring applications (like Grails). There should be caching for autowireBeanProperties and autowireByName too. Grails has caching for autowireByName in the DefaultListableBeanFactory implementation it uses: https://github.com/grails/grails-core/blob/master/grails-core/src/main/groovy/org/codehaus/groovy/grails/commons/spring/ReloadAwareAutowireCapableBeanFactory.java . Caching should be provided by default. |
Lari Hotari commented Might be related to #12604. |
Lari Hotari commented This issue might also be related to #12643 . |
Kristian Rosenvold commented The enclosed patch adds caching to DefaultListableBeanFactory#getBeanNamesForType, providing a huge boost to any users of In a running server environment (for a typical web application using web scopes and The patch is applied over 3.0.5 but applies cleanly at r4225 on trunk. The patch is entirely non-functional and adds no new tests but it breaks no tests either. There are several tests that verify that the caching does not break anything, something I repeatedly discovered while making the patch. I have also enclosed a profiler report showing the loading of the application context before and after this patch, and also a diff-only report. The reports are not complete, but shows running one wired integration test with 860 autowired dependencies from a pool of 1021 beans (there is no external io in this test) |
Kristian Rosenvold commented This patch operates at a higher level in the stack than the #12604 patch and applying this patch will render the #12604 patch useless. I have not tried the patch at #12604, but I did another patch a couple of years ago using readerwriterlocks that turned out to be very prone to deadlocks in highly concurrent environments. At the time I think I decided this was a fundamental problem of using readerwriterlocks in this setting. This patch has no deadlock potential. |
Aaron Digulla commented Any chance to see some work on this? The performance of looking up Spring beans by type is a bother for us as well. We solved this outside of Spring by using this workaround:
The idea is that for most singletons, there is only a single implementation, so the ID can be omitted and Spring will use the type of the bean to generate a name. This means that you need to do some extra work for interfaces or that you must always request beans using interface by a specific ID and never by type. But it's a poor solution. It's pretty simple to cache the bean definition lookup in |
Mindaugas Žakšauskas commented Spring, please solve this. Here's my story: |
Mike Youngstrom commented I've been told this is a risky fix because it is right in the core of some complex code. NOW is the perfect time attempt to fix this since you are so early in the 3.2 release cycle! |
Chris Beams commented Thanks, Kristian for the patch. With minor modifications, it has been applied and indeed solves the problem nicely. At the time of this writing the snapshot containing these changes has just finished publishing. There are a large number of watchers on this issue -- please consider taking the latest 3.2.0.BUILD-SNAPSHOT for a spin and provide any feedback. Note that we'll be shipping this change with 3.2 M1 within a day or two as well; but naturally any feedback prior to that would be great.
|
Sylvain LAURENT commented For those watching this issue, it has ben back ported to 3.1.2, see #14083 |
Eberhard Wolff opened SPR-6870 and commented
The Autowiring algorithms tries to work out the dependencies by building up the Beans. If this fails, a BeanCreationException is thrown, caught and then a different way to handle the dependencies is tried. In some situations this results in slow performance and it is probably also not the nicest programming style.
Affects: 2.5.6
Attachments:
Sub-tasks:
Issue Links:
Referenced from: commits 841d953, 0d18deb, db1cb13, f75c01d, 4c7a1c0
45 votes, 45 watchers
The text was updated successfully, but these errors were encountered: