O ponto dos microservices é facilitar o gerenciamento e escalabilidade de aplicações na nuvem. Se você desenvolve sua própria nuvem, certamente não tem problema nenhum o fato dela ser privada, apesar que não é realista esperar que desenvolvedores de soluções tenham knowhow pra criar sua própria infraestrutura de rede e servidores virtuais (nuvem). Isso é trabalho para gigantes como Amazon, MS e IBM.
Um container JavaEE full é uma aplicação monolítica, seus componentes não escalam de maneira independente. Por esse motivo imagino que devem ser péssimas opções para microservices.
O mesmo vale para SGBD tradicionais, e de fato, banco de dados NoSQL são mais populares neste segmento microservice/nuvem.
Existem muitas empresas no setor financeiro que trabalham com virtualização há muito tempo, inclusive em plataforma mainframe. A própria IBM tem seu foco em soluções de cloud híbridas, porque grandes empresas de diversos setores não estão preparadas ou interessadas em mover seus workloads para infraestruturas públicas de terceiros. Cloud privada é e continuará a ser uma opção para grandes corporações por muito tempo.
Mas isso já é desvio do assunto original…
Não tem nada de errado em compartilhar banco de dados. Eu faço isso direto para queries, ao invés de ter que fazer um serviço depender de outro, só pra ter acesso a alguma informação.
O problema é que na maioria dos sistemas, não existe separação entre queries e comandos, e o banco de dados é visto como um repositório de dados. Nesse modelo, quando diferentes serviços tentam atualizar o mesmo banco, existe a possibilidade de introduzir dados inconsistentes sob o ponto de vista de um serviço específico, e isso causar bugs na sua aplicação. No caso, a solução é você adotar um modelo diferente, onde queries e operações que podem alterar o estado do sistema são separados. Existem várias técnicas e tecnologias que te ajudam a reforçar essa separação na sua arquitetura. Ex: CQRS, Datomic.
Para informação: