- Governança-TIC
- 01. Estrutura do DTIC e Comitês
- 02. Estratégia de TIC
- 03. Indicadores e Metas de TIC
-
04. Processos de TIC
-
1.01. Contratação de STIC
-
1.02. Processo do PETIC
-
1.03. Processo do PDTIC
-
1.04. Capacitação de TIC
-
1.05. Processo do PAT
-
1.06. Orçamentos de TIC
-
2.01. Gestão de Demandas TIC
-
2.02. Gestão de Projetos TIC
-
2.03. Gestão de Contratos TIC
-
3.01. Gestão de Riscos TIC
-
3.02. Continuidade de Serviços TIC
-
3.03. Processo de Eventos TIC (Monitoria)
-
3.04. Processo de Backup / Restore
-
4.01. Desenvolvimento de Software
-
Matriz de Artefatos MDS
-
Diretrizes Desenvolvimento de Software
- Arquitetura de Desenvolvimento Java
-
Modelo Conceitual de Classes
-
Modelo de Atividades
- Modelo de Banco de Dados
-
Modelo de Caso de Uso
- Modelo de Classes
-
Modelo de Componentes
-
Modelo de Implantação
-
Modelo de Instâncias
-
Modelo de Interação
-
Modelo de Máquina de Estados
- Padrão de Interface Web de Sistema com o Usuário
- Orientações de trabalho Desenvolvimento de Software
-
Diretrizes Desenvolvimento de Software
-
Matriz de Artefatos MDS
-
4.02. Sustentação de Software
-
5.01. Central de Serviços TIC
-
5.02. Gerenciamento de Problemas TIC
-
5.03. Gerenciamento de Mudanças TIC
-
5.04. Gerenciamento de Liberação e Implantação TIC
-
5.05. Gerenciamento de Configuração e Ativo de Serviços TIC
-
5.06. Gerenciamento do Catálogo de Serviços TIC
-
5.07. Gerenciamento de Nível de Serviço TIC
-
6.01. Pesquisa Satisfação Usuários de TIC
-
6.02. Organizar Reuniões de TIC
-
Ferramentas para Mapeamento de Processos de TIC
-
sobre Processo de TI
-
1.01. Contratação de STIC
- 05. Segurança de TIC
- 06. Portfólio de TIC
-
Base de Conhecimento
- Capacitação de TIC
-
Normativos CNJ
-
Normativos DTIC
- Publicações de TIC
-
Rede sem fio (Wi-Fi)
-
Relatório Atividades DTIC
- Videoconferência
Para utilização de um banco write e outro read-only em uma aplicação com Spring, siga as instruções abaixo:
1. Crie uma classe que contenha os tipos que farão distinção entre os bancos de escrita e leitura.
Por exemplo:
public enum DatabaseType { READ_ONLY, WRITE }
2. Crie uma classe que armazenará o tipo no context da thread em execução.
public class DatabaseContextHolder { private static final ThreadLocal<DatabaseType> contextHolder = new ThreadLocal<DatabaseType>(); public static void setDatabaseType(DatabaseType databaseType) { if (databaseType == null) databaseType = DatabaseType.WRITE; // default to write database contextHolder.set(databaseType); } public static DatabaseType getDatabaseType() { return (DatabaseType) contextHolder.get(); } public static void clearDatabaseType() { contextHolder.remove(); } }
3. Criar um DataSource específico que fará o roteamento baseado no tipo definido.
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; public class DatabaseRoutingDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return DatabaseContextHolder.getDatabaseType(); } }
4. Criar uma annotation para definir o tipo desejado.
Vc pode criar uma onde se escolha o tipo ou uma que seja read-only e aplique onde for necessário. Vou colocar aqui o último caso:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface ReadOnlyDatabase { }
5. Criar um interceptor para captar o uso da annotation.
import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; public class DatabaseTypeAdvice implements MethodInterceptor { @Override public Object invoke(MethodInvocation methodInvocation) throws Throwable { Annotation[] annotations = methodInvocation.getMethod().getAnnotations(); DatabaseType databaseType = DatabaseType.WRITE; for (Annotation annotation : annotations) { if (annotation instanceof Entity) databaseType = DatabaseType.READ_ONLY; } DatabaseContextHolder.setDatabaseType(databaseType); return methodInvocation.proceed(); } }
6. Feito isso é só configurar no application-context.xml.
<bean id="databaseRoutingDataSource" class="pacote.DatabaseRoutingDataSource"> <property name="targetDataSources"> <map key-type="pacote.DatabaseType"> <entry key="WRITE" value-ref="writeDataSource"/> <entry key="READ_ONLY" value-ref="readOnlyDataSource"/> </map> </property> <property name="defaultTargetDataSource" ref="writeDataSource"/> </bean>
Note que no "sessionFactory" vc deve definir o datasource acima.
Defina o interceptor:
<bean id="databaseTypeAdvice" class="pacote.DatabaseTypeAdvice"/>
E no "applicationTxProxyTemplate" inclua a seguinte propriedade que referencie o interceptor:
<property name="preInterceptors"> <list> <ref local="dataSourceTypeAdvice"/> </list> </property>