Tenho um aplicativo com uma conexão com um banco local no Derby, onde todo o mapeamento, classe de acesso aos Dados(DAO) ja foram implementados e devidamente testados. O meu problema surgiu depois da necessidade de inserir uma segunda conexão. Um banco de dados remoto mysql. Bom fiz o mapeamento(JPA/Hibernate, DAOs, etc). Então passei a ter duas Unidades de persistência no arquivo xml. Quando inicio a aplicação crio duas EntityManagerFactory uma para o banco local e outra para o banco remoto. Então faço acesso a alguns dados no banco local e não recebo nenhum erro. Em seguida faço uma consulta e uma atualização no meu banco remoto(mysql) e obtenho sucesso em ambas as operações e em um terceiro momento quando vou fazer uma operação de salvamento em uma tabela do meu banco local obtenho o seguinte erro:
15/10/2011 23:52:46 org.hibernate.util.JDBCExceptionReporter logExceptions
AVISO: SQL Error: 40000, SQLState: 08003
15/10/2011 23:52:46 org.hibernate.util.JDBCExceptionReporter logExceptions
GRAVE: Nenhuma conexão corrente.
15/10/2011 23:52:46 org.hibernate.util.JDBCExceptionReporter logExceptions
AVISO: SQL Error: 0, SQLState: null
15/10/2011 23:52:46 org.hibernate.util.JDBCExceptionReporter logExceptions
GRAVE: org.apache.derby.jdbc.EmbeddedDriver não está registrado com o gerenciador do driver JDBC
15/10/2011 23:52:46 org.hibernate.event.def.DefaultLoadEventListener onLoad
INFO: Error performing load command
org.hibernate.exception.GenericJDBCException: Cannot open connection
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:29)
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:426)
at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:139)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1547)
at org.hibernate.loader.Loader.doQuery(Loader.java:673)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
at org.hibernate.loader.Loader.loadEntity(Loader.java:1860)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:48)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:42)
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3044)
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:395)
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:375)
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:139)
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:195)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:103)
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:878)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:815)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:808)
at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:182)
at monitor.info.modelo.persistencia.monitorinfodb.dao.MonitorInfoJpaController.findMonitorInfo(MonitorInfoJpaController.java:123)
at monitor.info.modelo.persistencia.monitorinfodb.dao.MonitorInfoJpaController.create(MonitorInfoJpaController.java:43)
O erro ocorre no método que persiste o novo objeto no banco local. Será que eu perco a conexão do banco local (org.apache.derby.jdbc.EmbeddedDriver) quando acesso o banco mysql, pois quando não acesso o banco remoto o aplicativo roda normalmente e consigo salvar dados no banco local. Estou meio perdido com a situação. Se alguem tiver qualquer opinião, dica, fico grato.
public class Persistencia {
private static EntityManagerFactory monitorInfoJavaDB;
private static EntityManagerFactory marceloDB;
public static EntityManagerFactory getMonitorInfoJavaDB() {
if (monitorInfoJavaDB == null) {
Map map = new LinkedHashMap();
map.put("hibernate.connection.driver_class", "org.apache.derby.jdbc.EmbeddedDriver");
map.put("hibernate.connection.username", "monitor");
map.put("hibernate.connection.password", "monitorando");
map.put("hibernate.connection.url", "jdbc:derby:/home/marcelo/javadb/bancos/MONITORINFO_DB");
map.put("hibernate.cache.provider_class", "org.hibernate.cache.NoCacheProvider");
monitorInfoJavaDB = Persistence.createEntityManagerFactory("MonitorINFO-V3PU-JavaDB",map);
}
return monitorInfoJavaDB;
}
public static EntityManagerFactory getMarceloDB() {
if (marceloDB == null) {
Map map = new LinkedHashMap();
map.put("hibernate.connection.url", "jdbc:mysql://IP-SERVIDOR-REMOTO:3306/MARCELO_DB");
map.put("hibernate.connection.username", "USER");
map.put("hibernate.connection.password", "SENHA");
marceloDB = Persistence.createEntityManagerFactory("MonitorINFO-V3PU-marceloDB", map);
}
return marceloDB;
}
}
metodo onde ocorre o erro
private void registrarMonitor(){
MonitorInfo monitorInfo = new MonitorInfo(chave.getIdchave());
monitorInfo.setValidacao(20);
monitorInfo.setValidado(Short.valueOf("1"));
Monitor monitor = new Monitor();
monitor.setNome(txtNome.getText());
monitor.setEmail(txtEmail.getText());
monitor.setLogin(txtLogin.getText());
monitor.setSenha(new String(txtSenha.getPassword()));
MonitorInfoJpaController jpamf = new MonitorInfoJpaController(null, Persistencia.getMonitorInfoJavaDB());
try {
jpamf.create(monitorInfo); //aqui ocorre o erro, esta classe foi criada através do assistente do netbens 7 com um CRUD para a classe de entidade MonitorInfo , ja verifiquei a classe e funciona quando não acesso o mysql
} catch (PreexistingEntityException ex) {
Logger.getLogger(Splash.class.getName()).log(Level.SEVERE, null, ex);
} catch (Exception ex) {
Logger.getLogger(Splash.class.getName()).log(Level.SEVERE, null, ex);
}
MonitorJpaController jpa = new MonitorJpaController(null, Persistencia.getMonitorInfoJavaDB());
try {
jpa.create(monitor);
} catch (Exception ex) {
Logger.getLogger(Splash.class.getName()).log(Level.SEVERE, null, ex);
}
}
então cara. Inicialmente eu sei que ele esta em pé, pois eu acesso algumas tabelas no banco local(derby) porém depois que eu acesso o mysql e tento acessar novamente o banco local(derby) é que recebo este erro. Muito estranho. Mas vou dar mais uma olhada ver se encontro algo, do contrario vou ter que mudar a estratégia. Valeu!