lat*_*lus 6 java oracle spring hibernate transactions
我正在使用Spring和Hibernate管理Java Web应用程序.我使用Spring和Hibernate工具来处理持久性级别,所以我不需要提交\ rollback我的事务.应用程序是并发的,因此用户可以修改相同的记录,我决定使用Read Committed隔离级别.
问题是有时我在日志中发现JDBC错误,并且所有下一个请求都出现相同的错误,阻止了应用程序行为.
这些是事务管理中涉及的组件:
@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;
}
Run Code Online (Sandbox Code Playgroud)
在db session监视器中,当这个东西发生时,我得到了一个INACTIVE事务.
我得到的错误如下:
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
Run Code Online (Sandbox Code Playgroud)
问题是事务和连接应该自动打开和关闭......我希望并发修改失败的事务得到回滚......但似乎它们变得不活跃.
我附上了我的hibernate配置.
<?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.hbm2ddl.auto">update</property> -->
<property name="hibernate.connection.isolation">2</property>
<!-- Disable the second-level cache -->
<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>
<!-- Show and print nice SQL on stdout -->
<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>
Run Code Online (Sandbox Code Playgroud)
作为连接库,我使用ojdbc.任何帮助将不胜感激.我不知道在哪里检查.
PS:我补充一点,这个错误每2天产生一次.
编辑:只是另一个集成,这是我在我的server.xml上,它可能与这里的东西有关?
<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"/>
Run Code Online (Sandbox Code Playgroud)
你说I add that this error spawns like once every 2 days.如果你的数据库流量很高,我认为管理连接池,例如使用C3P0和管理总连接、超时...等
例如
<property name="hibernate.c3p0.timeout">500</property>
Run Code Online (Sandbox Code Playgroud)
此空闲连接将从池中删除(500 秒)
还有更多知识在这里。
| 归档时间: |
|
| 查看次数: |
2967 次 |
| 最近记录: |