Configurando o Fast Path PWSJPA
O Java™ Persistence API (JPA) é uma especificação muito flexível que fornece diretrizes sobre como os implementadores devem converter dados relacionais na forma de objeto Java. Devido à natureza flexível dessa API, uma grande quantia de trabalho é concluída no tempo de execução pelo provedor da API para determinar como carregar os dados relacionais corretamente para o formato de objeto. Essa flexibilidade resulta em um tempo de execução que, em determinadas circunstâncias, deve-se executar continuamente o código redundante para assegurar que os dados sejam carregados adequadamente. Ao abrir mão de parte dessa flexibilidade, a otimização do WSJPA FastPath tenta ignorar o máximo desse código redundante e gera um código altamente otimizado que interage diretamente com a camada do JDBC. Essa otimização é convertida em desempenho melhorado.
Sobre Esta Tarefa
A otimização desses caminhos de códigos é um processo muito complexo e, portanto, nem todos os modelos de domínio satisfazem os requisitos para as otimizações de Fast Path WSJPA.
O recurso Fast Path pode melhorar o desempenho de alguns aplicativos que têm seus dados que são modelados em um formato aceitável e que não estão usando recursos JPA estendidos.
public Customer findCustomer(int id) {
return em.find(Customer.class, id);
}
Esse exemplo é um método auxiliar simples que localiza uma entidade de cliente. Cada vez que o método findCustomer é iniciado, o tempo de execução de JPA executa grandes quantias de códigos para analisar a solicitação, acessar o banco de dados e carregar a Customer Entity. Sem o uso da otimização do FastPath, a maior parte da lógica é idêntica para a segunda execução e as subsequentes do método findCustomer. Uma pequena parte das decisões do tempo de execução da primeira execução é retida para chamadas futuras do método findCustomer. Esse processamento de código redundante pode causar problemas de desempenho para alguns cenários.
10855 fp_pu INFO [main] FP - Successfully generated FastPath com.ibm.ws.persistence.fastpath.entities.Customer$Find$FastPath@1f6b69d7".
Quando essa mensagem for registrada, todas as exceções futuras de localização de um Cliente usarão esse novo caminho gerado.
O exemplo anterior descreveu como um caminho do localizador pode ser executado. O FastPath também tenta otimizar o carregamento lento de campos (relacionamento e não relacionamento) e a execução de NamedQueries.
Configurando o FastPath:
Quando a propriedade de unidade de persistência wsjpa.FastPath=true estiver configurada, o tempo de execução de JPA tentará determinar quais operações poderão ser manipuladas com segurança. As propriedades Incluir e Excluir podem ser usadas para configurar explicitamente quais operações serão executadas usando o FastPath.
<property name=”openjpa.MetaDataRepository” value=”Preload=true”/>
<property name=”wsjpa.FastPath”
value=”true(Include=’<path>;,<path>;...’;Exclude=’<path>,<path>...’)”>
- Localizador: <Nome completo da entidade> (como com.ibm.ws.jpa.Customer)
- Campo de carregamento lento: <Nome completo do campo> (como com.ibm.ws.jpa.Customer.cars)
- Consulta nomeada: <Nome completo da consulta> (como com.ibm.ws.jpa.customer_find_by_id)
- Se nenhuma propriedade (Incluir/Excluir) for especificada, o tempo de execução verificará todos os tipos persistentes e tentará determinar quais caminhos poderão ser processados.
- Se a propriedade incluir estiver especificada, somente os caminhos especificados serão processados e a propriedade excluir será ignorada.
- Se a propriedade excluir estiver especificada, todos os caminhos que não estiverem na lista de exclusão tentarão ser manipulados.
- Se algum campo for fornecido na lista de exclusão e o tipo de busca do campo for EAGER, o campo será ignorado, pois ele nunca seria carregado lentamente.
<property name="wsjpa.FastPath" value="false"/>
Nesse exemplo, false é o valor padrão. Essa otimização não é ativada por padrão.<property name="wsjpa.FastPath" value="true"/>
O tempo de execução processa todas as entidades e tenta determinar quais localizadores, operações de carregamento lento e consultas nomeadas poderão ser otimizadas.<property name="wsjpa.FastPath" value="true(Exclude=com.ibm.ws.jpa.entities.Customer.address,customer.findById"/>
Same
as in example #2, except lazy loading the Customer.address field and
the named query customer.findById are excluded from FastPath processing.<property name="wsjpa.FastPath" value="true(Include=com.ibm.ws.jpa.entities.Customer, customer.findById"/>
As únicas operações processadas são a localização de um Cliente e a execução da NamedQuery ‘customer.findById’. Todas as outras operações são executadas usando o tempo de execução de JPA normal.Limitações:
- Incompatível com a propriedade openjpa.DataCache.
- Incompatível com a propriedade openjpa.FetchPlan.
- Passagem de um LockModeType e/ou um mapa de propriedades para o método de localização EntityManager.
- Estratégias de campo customizado
@org.apache.openjpa.persistence.Factory, @javax.persistence.SecondaryTable,
@org.apache.openjpa.persistence.Externalizer,
@org.apache.openjpa.persistence.ExternalValues,
@org.apache.openjpa.persistence.LRS, @java.sql.Lob, @java.sql.Clob, @java.sql.Blo- Mapeamento de Coluna XML
- Integráveis
- Somente a herança de tabela única é suportada.
- Retorno de chamada de @javax.persistence.PostLoad
- Identificadores delimitados
- Execução de um caminho que resulta em:
- Busca de um campo ManyToMany.
- Busca de uma coleção que é implementada como um Mapa ou uma Matriz.
- Execução de uma instrução SQL que resulta na junção de uma tabela unida
- Execução de uma instrução SQL que resulta na junção da mesma tabela mais de uma vez. Por exemplo: A presença de uma entidade com vários relacionamentos EAGER OneToOne com a mesma Entidade.
- Carregamento de vários níveis de relacionamentos eager. Como {A->(eager)B->(eager)C}
- Chamada dos seguintes métodos setFirst, setFlush, setHind, setLockMode e setMax em um NamedQuery.
- Incompatível com aplicativos JPA que usam PureQuery.
- Incompatível com aplicativos JPA que usam intenção de acesso.
- Configuração de qualquer propriedade no tempo de execução que altera como a JPA busca dados.