Using singletons leads to very monolithic systems that are hard to test and hard to change. Instead we should prefer modular services like Udo proposed.
I would go further and say that we should question any non-constant use of “static”. Anthony > On Apr 3, 2017, at 9:01 AM, Udo Kohlmeyer <ukohlme...@pivotal.io> wrote: > > Correct, that would be the definition. > > Yet, we find that our use of singletons within Geode is limiting to say that > least. With the idea of wanting to be able to create/run multiple cache > instance within the same JVM (especially for testing) a singleton will be > problematic. > > In addition to that, the alternative is not that hard to construct and in > many cases easier to manage. > > --Udo > > > On 4/3/17 08:57, Jinmei Liao wrote: >> Isn't "that instance is reused each invocation" my understanding of a >> "singleton"? >> >> On Mon, Apr 3, 2017 at 11:49 AM, Udo Kohlmeyer <ukohlme...@pivotal.io> >> wrote: >> >>> -1 For using singletons >>> >>> Using a Factory pattern you can avoid having to create singletons in >>> addition to caching created commands to avoid the recreation of the >>> instance. >>> >>> The SSLConfigurationFactory is a simple example where you create an >>> instance when required. Once an instance is created, that instance is >>> reused each invocation. >>> >>> --Udo >>> >>> >>> >>> On 4/3/17 08:30, Jinmei Liao wrote: >>> >>>> I think the client commands needs to be singleton instances even after you >>>> change the sequence of initialization. We don't want to have each client >>>> operation ends up creating a new command instance, right? That would be a >>>> more performance drag. >>>> >>>> On Thu, Mar 30, 2017 at 2:14 PM, Kirk Lund <kl...@apache.org> wrote: >>>> >>>> PS: I'll be writing and using JMH benchmarks to drive these changes. I'll >>>>> also create new unit tests for each of these classes that don't currently >>>>> have unit tests. >>>>> >>>>> On Thu, Mar 30, 2017 at 10:58 AM, Kirk Lund <kl...@apache.org> wrote: >>>>> >>>>> The client Commands now check with SecurityService even when security is >>>>>> not configured. This has introduced a negative performance impact. >>>>>> >>>>>> The best way to fix something like this is to tell the Command instance >>>>>> when it's being constructed that is does or does not need to perform >>>>>> security checks. >>>>>> >>>>>> Unfortunately, Commands are all implemented as singletons which are very >>>>>> eagerly instantiated during class loading of CommandInitializer (who >>>>>> thought that was a good idea?!). >>>>>> >>>>>> In order to fix this performance problem, I would need to get rid of >>>>>> >>>>> these >>>>> >>>>>> problematic static initializer blocks that so eagerly construct the >>>>>> Commands so that I can put off constructing them until AFTER the Cache >>>>>> is >>>>>> initializing and specifically AFTER the Cache has determined if it is >>>>>> >>>>> using >>>>> >>>>>> security or not. >>>>>> >>>>>> This means I'm going to have to do some refactoring of >>>>>> >>>>> CommandInitializer, >>>>> >>>>>> the Command classes, ServerConnection, AcceptorImpl, etc. >>>>>> >>>>>> Any other approach is going to have such minimal impact on performance >>>>>> that I'm not even interested in doing less than this. >>>>>> >>>>>> From a very high level, I would change the code so that the Cache owns >>>>>> >>>>> the >>>>> >>>>>> Server which owns the Command instances. In this way, the configuring of >>>>>> use of security can trickle down from Cache to each Command. I would >>>>>> primarily be altering static singletons, static initializers and adding >>>>>> constructors. >>>>>> >>>>>> Does anyone have a problem with me changing the above classes and >>>>>> especially getting rid of the static initializers and singleton >>>>>> >>>>> instances? >>>>> >>>>>> >>>> >> >