Skip to content

Instantly share code, notes, and snippets.

@sidneydemoraes
Last active March 14, 2019 18:18
Show Gist options
  • Save sidneydemoraes/340bb6cf08e9668c3002892d85afec61 to your computer and use it in GitHub Desktop.
Save sidneydemoraes/340bb6cf08e9668c3002892d85afec61 to your computer and use it in GitHub Desktop.
Proxy de EntityManager para banco RO e RW
@Component
public class EntityManagerProxy implements InvocationHandler {
private Logger log = LogManager.getLogger(EntityManagerProxy.class);
/**
* Read-only db mirror for increased performance on select queries.
*/
@PersistenceContext(type = PersistenceContextType.TRANSACTION, unitName = "readPersistenceUnit")
@Setter
private EntityManager entityManagerRead;
/**
* Write-only persistence unit for increased performance on inserts and updates without being locked by select queries.
*/
@Setter
@PersistenceContext(type = PersistenceContextType.TRANSACTION, unitName = "writePersistenceUnit")
private EntityManager entityManagerWrite;
@Override
public Object invoke (Object proxy, Method method, Object[] args) throws Throwable {
log.debug("EntityManagerProxy -> método {} invocado.", method.getName());
Object resultado = null;
try {
if (method.getName().startsWith("find") ||
method.getName().equalsIgnoreCase("createNamedQuery") ||
method.getName().equalsIgnoreCase("getCriteriaBuilder") ||
((method.getName().equalsIgnoreCase("createNativeQuery") || (method.getName().equalsIgnoreCase("createQuery")) &&
args[0].toString().toLowerCase().startsWith("select"))) ||
(method.getName().equalsIgnoreCase("createQuery")
&& args[0] instanceof CriteriaQuery
&& TypeResolver.resolveRawArgument(CriteriaQuery.class, args[0].getClass()) == UsuarioMobileAuth.class)) {
log.debug("Base de leitura utilizado.");
resultado = ReflectionUtils.invokeMethod(method, entityManagerRead, args);
} else {
log.debug("Base de escrita utilizado.");
resultado = ReflectionUtils.invokeMethod(method, entityManagerWrite, args);
}
} catch (RuntimeException ex) {
log.error("Não foi possível invocar o método {} no EntityManagerEGProxy.\n{}", method.getName(), ex);
throw ex;
}
return resultado;
}
}
public abstract class MysqlAbstractDao<K extends Comparable<K>, E> extends AbstractDao<K, E> {
@Autowired
private InvocationHandler proxy;
@Override
protected EntityManager getEntityManager() {
EntityManager proxyEm = (EntityManager) Proxy.newProxyInstance(
EntityManager.class.getClassLoader(),
new Class[] { EntityManager.class },
proxy
);
return proxyEm;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment