Java Hibernate在大约24小时后抛出JDBC异常。使用MYSQL/Hibernate
服务器启动24小时左右后,hibernate将引发JDBCConnection异常。我正在使用Hibernate/Mysql/RESTJava项目 hibernate.cfg.xmlJava Hibernate在大约24小时后抛出JDBC异常。使用MYSQL/Hibernate,java,mysql,hibernate,Java,Mysql,Hibernate,服务器启动24小时左右后,hibernate将引发JDBCConnection异常。我正在使用Hibernate/Mysql/RESTJava项目 hibernate.cfg.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration SYSTEM "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration SYSTEM
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.bytecode.use_reflection_optimizer">false</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/DB</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password"></property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">false</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="cache.use_second_level_cache">true</property>
<property name="cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">3000</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
</session-factory>
这让我很头疼在将连接提交给应用程序使用之前,经常会看到连接池中长期处于空闲状态的连接出现问题。大多数连接池都有控制连接验证的配置。在将连接提供给应用程序之前,您可能希望将c3po配置为测试连接。如果它发现连接不好,它将在内部处理异常,您将不必处理它。启用此选项的缺点是会有到数据库的额外往返,因此从连接池获取连接需要更长的时间 您可能希望使用
testConnectionOnCheckout
而不是idleConnectionTestPeriod
(您可能正在使用它)
引用
配置连接测试
c3p0可以配置为测试其在网络中汇集的连接
多种方法,以最大限度地减少应用程序
请参阅断开或“陈旧”的连接。池连接可能会对一个用户造成不良影响
各种原因——一些JDBC驱动程序故意“超时”
持久的数据库连接;后端数据库或网络
有时会出现“绞合”共用连接;而连接可以
由于资源泄漏,随着时间的推移和使用而损坏,
驱动程序错误或其他原因
c3p0在测试中为用户提供了很大的灵活性
通过以下配置参数进行连接:
- 自动测试表
- ConnectionTestClassName
- idleConnectionTestPeriod
- preferredTestQuery
- testConnectionOnCheckin
- 测试连接取消检查
在将连接提交给应用程序使用之前,在连接池中闲置很长时间的连接经常会出现问题。大多数连接池都有控制连接验证的配置。在将连接提供给应用程序之前,您可能希望将c3po配置为测试连接。如果它发现连接不好,它将在内部处理异常,您将不必处理它。启用此选项的缺点是会有到数据库的额外往返,因此从连接池获取连接需要更长的时间 您可能希望使用
testConnectionOnCheckout
而不是idleConnectionTestPeriod
(您可能正在使用它)
引用
配置连接测试
c3p0可以配置为测试其在网络中汇集的连接
多种方法,以最大限度地减少应用程序
请参阅断开或“陈旧”的连接。池连接可能会对一个用户造成不良影响
各种原因——一些JDBC驱动程序故意“超时”
持久的数据库连接;后端数据库或网络
有时会“搁浅”康涅狄格州
public class HibernateTemplate {
private static final Logger logger = Logger.getLogger(HibernateTemplate.class);
static SessionFactory factory = null;
private Session session = null;
private Transaction txn = null;
public Session getSession() {
try {
if (session == null || !session.isOpen()) {
session = factory.openSession();
txn = session.beginTransaction();
}
} catch (JDBCConnectionException e) {
logger.error("JDBC Connection Exception " + e.getStackTrace());
}
return session;
}
public HibernateTemplate() {
if (factory == null || factory.isClosed()) {
factory = new Configuration().configure().buildSessionFactory();
}
getSession();
}
private void postAction() {
txn.commit();
}
private void postSession() {
if (session.isOpen())
session.close();
}
public Object get(Criteria cr) {
Object responseEntity = null;
getSession();
try {
responseEntity = cr.list();
smsSent = false;
} catch (JDBCConnectionException e) {
logger.error("JDBC Connection Exception " + e.getStackTrace());
} catch (Exception ex) {
logger.error("Exception while fetching data using Hibernate Template " + ex);
return "error";
} finally {
// postAction();
postSession();
}
return responseEntity;
}
}