I have a programm, which uses a database on one server to make write operations and a replication of this database is used for reading operations, situated on another server. if I execute a write operation and then a read operation there is thrown the exception posted below.
If I excute my programm only using the write operation or only the read operation, there are no problems, only by switching the server during my running application.
I hope somebody can help me...I already tried very much to solve the problem, but nothing works right now
thank you
the exception:
Code:
org.hibernate.exception.GenericJDBCException: could not load an entity: [mainpackage.Person#67]
at org.hibernate.exception.ErrorCodeConverter.handledNonSpecificException(ErrorCodeConverter.java:92)
at org.hibernate.exception.ErrorCodeConverter.convert(ErrorCodeConverter.java:80)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.loader.Loader.loadEntity(Loader.java:1269)
at org.hibernate.loader.entity.EntityLoader.load(EntityLoader.java:139)
at org.hibernate.loader.entity.EntityLoader.load(EntityLoader.java:124)
at org.hibernate.persister.entity.BasicEntityPersister.load(BasicEntityPersister.java:2453)
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:387)
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:368)
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:166)
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:140)
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:249)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:123)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:561)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:556)
at mainpackage.Main.readEntries(Main.java:55)
at mainpackage.Main.main(Main.java:29)
Caused by: com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:
** BEGIN NESTED EXCEPTION **
java.io.EOFException
MESSAGE: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
STACKTRACE:
java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1997)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2411)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2916)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3256)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1313)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1448)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:107)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1183)
at org.hibernate.loader.Loader.doQuery(Loader.java:363)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:203)
at org.hibernate.loader.Loader.loadEntity(Loader.java:1255)
at org.hibernate.loader.entity.EntityLoader.load(EntityLoader.java:139)
at org.hibernate.loader.entity.EntityLoader.load(EntityLoader.java:124)
at org.hibernate.persister.entity.BasicEntityPersister.load(BasicEntityPersister.java:2453)
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:387)
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:368)
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:166)
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:140)
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:249)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:123)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:561)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:556)
at mainpackage.Main.readEntries(Main.java:55)
at mainpackage.Main.main(Main.java:29)
** END NESTED EXCEPTION **
Last packet sent to the server was 4 ms ago.
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2622)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2916)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3256)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1313)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1448)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:107)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1183)
at org.hibernate.loader.Loader.doQuery(Loader.java:363)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:203)
at org.hibernate.loader.Loader.loadEntity(Loader.java:1255)
... 13 more
Exception in thread "main" org.hibernate.TransactionException: JDBC rollback failed
at org.hibernate.transaction.JDBCTransaction.rollback(JDBCTransaction.java:142)
at mainpackage.Main.readEntries(Main.java:72)
at mainpackage.Main.main(Main.java:29)
Caused by: com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: Connection.close() has already been called. Invalid operation in this state.
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:888)
at com.mysql.jdbc.Connection.getMutex(Connection.java:3728)
at com.mysql.jdbc.Connection.rollback(Connection.java:5204)
at org.hibernate.transaction.JDBCTransaction.rollback(JDBCTransaction.java:134)
... 2 more
my main.java
Code:
package mainpackage;
import java.util.List;
import java.io.IOException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class Main
{
public static void main(String[] args) throws IOException, InterruptedException
{
Configuration confRead = new Configuration();
SessionFactory sfRead = confRead.configure("topology3/hibernateRead.cfg.xml").buildSessionFactory();
confRead = null;
Configuration confWrite = new Configuration();
SessionFactory sfWrite = confWrite.configure("topology3/hibernateWrite.cfg.xml").buildSessionFactory();
confWrite = null;
insertTestPerson( sfWrite ,100 );
readEntries( sfRead );
}
public static void readEntries( SessionFactory sfRead ) throws IOException
{
//random value for id
int randomID;
for( int index = 0; index < 80; index++ )
{
randomID = (int)Math.floor( ( Math.random() * 100 ) + 1 );
Session session = null;
Transaction tx = null;
Person person = new Person();
try
{
session = sfRead.openSession();
tx = session.beginTransaction();
person = (Person)session.get(Person.class, randomID);
if( person != null )
{
List<Address> addresses = (List)person.getAddresses();
person.getName();
}
else
{
System.out.println("NULL" + randomID);
}
tx.commit();
}
catch (Exception e)
{
e.printStackTrace();
tx.rollback();
}
finally
{
session.close();
session = null;
}
}
System.out.println("[Method]::readEntries()");
}
public static void insertPerson( SessionFactory sfWrite, Person person )
{
Session session = null;
Transaction tx = null;
try
{
session = sfWrite.openSession();
tx = session.beginTransaction();
session.save( person ); // Person & Address -> DB
tx.commit();
}
catch (Exception e)
{
e.printStackTrace();
tx.rollback();
}
finally
{
session.close();
session = null;
}
}
public static void insertTestPerson( SessionFactory sfWrite, int number )
{
for( int i = 0; i < number; i++ )
{
Address address = new Address();
address.setZip("0000");
address.setCity("NOWHERE");
Person person = new Person();
person.setName("NOBODY");
person.addAddress( address );
insertPerson( sfWrite, person );
}
System.out.println("[Method]::insertTestPerson()");
}
}
the configuration files
hibernateWrite.cfg.xml:
Code:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://188.40.80.213/test_replication_db</property>
<property name="hibernate.connection.username">user</property>
<property name="hibernate.connection.password">pw</property>
<!-- property name="hibernate.connection.pool_size">0</property-->
<property name="show_sql">false</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.hbm2ddl.auto">create</property>
<property name="hibernate.c3p0.min_size">1</property>
<property name="hibernate.c3p0.max_size">100</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.maxIdleTime">1</property>
<!-- Mapping files -->
<mapping resource="mainpackage/Person.hbm.xml"/>
<mapping resource="mainpackage/Address.hbm.xml"/>
</session-factory>
</hibernate-configuration>
hibernateRead.cfg.xml:
Code:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://188.40.85.136/test_replication_db</property>
<property name="hibernate.connection.username">user</property>
<property name="hibernate.connection.password">pw</property>
<!-- property name="hibernate.connection.pool_size">0</property-->
<property name="show_sql">false</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- property to update database pr create a new one; can be 'create' or 'update' -->
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.c3p0.min_size">1</property>
<property name="hibernate.c3p0.max_size">100</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.maxIdleTime">1</property>
<!-- Mapping files -->
<mapping resource="mainpackage/Person.hbm.xml"/>
<mapping resource="mainpackage/Address.hbm.xml"/>
</session-factory>
</hibernate-configuration>