--
Você recebeu essa mensagem porque está inscrito no grupo "caelum-vraptor" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para caelum-vrapto...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para caelum-...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/caelum-vraptor.
Para mais opções, acesse https://groups.google.com/d/optout.
public class HibernateUtils {
private static SessionFactory sessionFactory = buildSessionFactory();
private static ThreadLocal<Session> sessions = new ThreadLocal<Session>();
private static ServiceRegistry serviceRegistry;
private static ThreadLocal<String> tenants = new ThreadLocal<String>();
private static SessionFactory buildSessionFactory() {
try {
Configuration cfg = new Configuration();
cfg.configure("hibernate.cfg.xml");
serviceRegistry = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
sessionFactory = cfg.buildSessionFactory(serviceRegistry);
return sessionFactory;
}catch(Throwable ex) {
System.err.println("Initial SessionFactory creation failed.");
ex.printStackTrace();
throw new ExceptionInInitializerError(ex);
}
}
private static Session openSession() {
return sessionFactory.withOptions().tenantIdentifier(getTenantId()).openSession();
}
public static Session getSession() {
if(sessions.get() == null) {
sessions.set(openSession());
}
return sessions.get();
}
public static void closeSession() {
if(sessions.get() != null) {
sessions.get().close();
sessions.remove();
}
}
public static void setTenantId(String tenantId) {
tenants.set(tenantId);
}
public static String getTenantId() {
if(tenants.get() == null) {
throw new RuntimeException("TenantId não definido pelo Interceptor");
}
return tenants.get();
}
public static void removeTenantId() {
tenants.remove();
}
}
@Intercepts
public class HibernateInterceptor implements Interceptor {
private final Sessao sessao;
public HibernateInterceptor(Sessao sessao) {
this.sessao = sessao;
}
@Override
public boolean accepts(ResourceMethod method) {
return true;
}
@Override
public void intercept(InterceptorStack stack, ResourceMethod method, Object instance) throws InterceptionException {
try {
HibernateUtils.setTenantId(sessao.getTenantId() != null ? sessao.getTenantId() : "public");
HibernateUtils.getSession().beginTransaction();
stack.next(method, instance);
HibernateUtils.getSession().getTransaction().commit();
}catch(RuntimeException err) {
HibernateUtils.getSession().getTransaction().rollback();
throw err;
}finally {
HibernateUtils.closeSession();
HibernateUtils.removeTenantId();
}
}
}
Oi Clairton bom dia,
Achei bem interessante a sua solução, mas pelo que vi rapidamente vc não faz a separação do tenant por schema correto? ou seja, todos os seus registros estão na mesma base e no mesmo schema, estou certo? Eu preciso fazer essa implementação por schema para ter uma melhor separação dos clientes e também para backups, porém, nunca implementei isso antes e estou tendo uma série de dificuldades. Atualmente estou usando o plugin do vraptor-hibernate, e ao que parece as conexões desse plugin e da implementação que citei acima estão diferentes, porém não estou conseguindo testar isso e resolver o problema. Muito obrigado pela ajuda, vlw ...
--
@ApplicationScoped
public class TenantSessionCreator {
private Map<String, SessionFactory> connections = new HashMap<String, SessionFactory>();
private ServiceRegistry serviceRegistry;
public Session create(Tenant tenant) {
try {
SessionFactory sessionFactory = this.connections.get(tenant.getTenantName());
if(sessionFactory == null) {
Configuration cfg = new Configuration();
cfg.configure("hibernate.cfg.xml");
cfg.setProperty("hibernate.connection.url", "jdbc:postgresql://localhost:5432/" + tenant.getTenantName());
serviceRegistry = new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()).build();
sessionFactory = cfg.buildSessionFactory(serviceRegistry);
this.connections.put(tenant.getTenantName(), sessionFactory);
}
return sessionFactory.openSession();
}catch(Exception err) {
System.err.println("Initial SessionFactory creation failed.");
err.printStackTrace();
throw new ExceptionInInitializerError(err);
}
}
}
public class Tenant {
private Sessao sessao;
@Inject
public Tenant(Sessao sessao) {
this.sessao = sessao;
}
public String getTenantName() {
if(this.sessao.getTenantName() == null) {
return new String("sisec_connection");
}else {
return this.sessao.getTenantName();
}
}
}
@Specializes
public class CustomSessionCreator extends SessionCreator {
private static final Logger LOGGER = LoggerFactory.getLogger(CustomSessionCreator.class);
private TenantSessionCreator tenantSessionCreator;
private Tenant tenant;
/**
* CDI eyes only
* @deprecated
*/
public CustomSessionCreator() {}
@Inject
public CustomSessionCreator(SessionFactory factory, TenantSessionCreator tenantSessionCreator, Tenant tenant) {
super(factory);
this.tenantSessionCreator = tenantSessionCreator;
this.tenant = tenant;
}
@Produces
@RequestScoped
public Session getInstance() {
Session session = this.tenantSessionCreator.create(this.tenant);
LOGGER.debug("opening a session {}", session);
return session;
}
public void destroy(@Disposes Session session) {
LOGGER.debug("closing session {}", session);
session.close();
}
}
@ApplicationScoped
public class TenantSessionCreator {
private Map<String, SessionFactory> connections = new HashMap<String, SessionFactory>();
private ServiceRegistry serviceRegistry;
public Session create(Tenant tenant) {
try {
SessionFactory sessionFactory = this.connections.get(tenant.getTenantName());
if(sessionFactory == null) {
Configuration cfg = new Configuration();
cfg.configure("hibernate.cfg.xml");
cfg.setProperty("hibernate.connection.url", "jdbc:postgresql://localhost:5432/" + tenant.getTenantName());
serviceRegistry = new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()).build();
sessionFactory = cfg.buildSessionFactory(serviceRegistry);
this.connections.put(tenant.getTenantName(), sessionFactory);
}
return sessionFactory.openSession();
}catch(Exception err) {
System.err.println("Initial SessionFactory creation failed.");
err.printStackTrace();
throw new ExceptionInInitializerError(err);
}
}
}
protected MultiTenantConnectionProvider getMultiTenantConnectionProvider() { | |
return new MultiTenantConnectionProviderDefault(cfg, multiTenancyConfiguration) { | |
private static final long serialVersionUID = -3482116169215468727L; | |
@Override | |
protected ConnectionProvider buildConnectionProvider() { | |
C3P0ConnectionProvider connectionProvider = new C3P0ConnectionProvider(); | |
connectionProvider.injectServices((ServiceRegistryImplementor) getInstance()); | |
connectionProvider.configure(cfg.getProperties()); | |
return connectionProvider; | |
} | |
}; | |
} |