Last active
March 14, 2019 18:18
-
-
Save sidneydemoraes/340bb6cf08e9668c3002892d85afec61 to your computer and use it in GitHub Desktop.
Proxy de EntityManager para banco RO e RW
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@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; | |
} | |
} | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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