I control a Java web application using Spring and Hibernate. I use the Spring and Hibernate tools to handle the persistence level, so I do not need to commit / rollback my transactions. The application is parallel, so users can modify the same entries, and I decided to use Read Committed as the isolation level.
The problem is that sometimes I find JDBC errors in the log, and all of the following queries go with the same error, blocking the behavior of the application.
These are the components involved in transaction management:
@Bean public SpringLocalSessionFactoryBean sessionFactory(DataSource dataSource){ SpringLocalSessionFactoryBean bean = new SpringLocalSessionFactoryBean(); bean.setConfigLocation(new ClassPathResource("hibernate.cfg.xml")); bean.setDataSource(dataSource); return bean; } @Bean public HibernateTransactionManager transactionManager(SessionFactory sessionFactory){ HibernateTransactionManager tm = new HibernateTransactionManager(); tm.setSessionFactory(sessionFactory); return tm; }
In the db session monitor, when this happens, I got transaction INACTIVE.
The error I am getting is the following:
WARN - (SqlExceptionHelper.java:144) - SQL Error: 0, SQLState: null 14/03/2016 15:46:06 - ERROR - (SqlExceptionHelper.java:146) - Connection oracle.jdbc.driver.T4CConnection@1a6d7ad6 is closed. 14/03/2016 15:46:06 - ERROR - (AutoCompleterController.java:73) - could not prepare statement org.hibernate.exception.GenericJDBCException: could not prepare statement at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126) at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:196) at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:160) at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1885) at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1862) at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1839) at org.hibernate.loader.Loader.doQuery(Loader.java:910) Caused by: java.sql.SQLException: Connection oracle.jdbc.driver.T4CConnection@1a6d7ad6 is closed. at org.apache.tomcat.dbcp.dbcp.DelegatingConnection.checkOpen(DelegatingConnection.java:398) at org.apache.tomcat.dbcp.dbcp.DelegatingConnection.prepareStatement(DelegatingConnection.java:279) at org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.prepareStatement(PoolingDataSource.java:313) at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:162) at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:186) ... 97 more
The problem is with transactions, and connections should automatically open and close ... And I expect that transactions that should have failed for simultaneous modification, get rolled back ... But it seems that they are inactive.
I am attaching a hibernate configuration.
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property> <property name="hibernate.connection.isolation">2</property> <property name="hibernate.cache.use_second_level_cache">false</property> <property name="hibernate.id.new_generator_mappings">true</property> <property name="hibernate.connection.autocommit">false</property> <property name="hibernate.show_sql">false</property> <property name="hibernate.format_sql">false</property> <property name="hibernate.use_sql_comments">false</property> <property name="hibernate.generate_statistics">false</property> </session-factory> </hibernate-configuration>
As a connection library, I am using ojdbc. Any help would be appreciated. I do not know where to check.
PS: I add that this error occurs just every 2 days.
EDIT: Another integration is what I have on my .xml server, can it be related to something here?
<Resource name="jdbc/ToolSfDB" global="jdbc/ToolSfDB" auth="Container" type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver" url="jdbc:oracle:thin:@//oracle01-internal.local:1521/orcl01" username="tools" password="mypwd" maxActive="10" maxIdle="2" minIdle="1" suspectTimeout="60" timeBetweenEvictionRunsMillis="30000" minEvictableIdleTimeMillis="60000" validationQuery="select 1 from dual" validationInterval="30000" testOnBorrow="true" removeAbandoned="true" removeAbandonedTimeout="60" abandonWhenPercentageFull="10" maxWait="10000" maxAge="60000"/>