java.sql.SQLException:Io异常:对等方重置连接:套接字写入错误
我使用的是Oracle11g、Hibernate3和jsf2。我在was7上部署了我的应用程序。一切都很顺利,但当我尝试在5-6小时后登录时,会出现错误java.sql.SQLException:Io异常:对等方重置连接:套接字写入错误,java,database,Java,Database,我使用的是Oracle11g、Hibernate3和jsf2。我在was7上部署了我的应用程序。一切都很顺利,但当我尝试在5-6小时后登录时,会出现错误 ERROR org.hibernate.util.JDBCExceptionReporter - Io exception: Connection reset by peer: socket write error [5/28/13 11:31:25:048 IST] 00000024 SystemErr R org.hibernate
ERROR org.hibernate.util.JDBCExceptionReporter - Io exception: Connection reset by peer: socket write error
[5/28/13 11:31:25:048 IST] 00000024 SystemErr R org.hibernate.exception.GenericJDBCException: could not execute query
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.loader.Loader.doList(Loader.java:2231)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2125)
at org.hibernate.loader.Loader.list(Loader.java:2120)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:401)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:361)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1148)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
我无法找到如何解决此错误。请帮助我。提前感谢
现在我已经用代码解决了这个问题,但我不知道这是正确的方法还是错误的。你会建议我吗,我应该继续这个解决方案
public class ApplicationUtilityBean implements Serializable {
private SessionFactory sessionFactory;
private AnnotationConfiguration cfg;
public String filePath;
private String realPath = Config.PATH;
public ApplicationUtilityBean() throws URISyntaxException {
getConnection();
}
public void getConnection() {
URL r = this.getClass().getClassLoader().getResource("hibernate.cfg.xml");
cfg = new AnnotationConfiguration();
cfg.configure(r);
String pwd = cfg.getProperty("hibernate.connection.password");
TripleDESEncryption tripledesenc = null;
try {
tripledesenc = new TripleDESEncryption();
} catch (Exception e) {
e.printStackTrace();
}
cfg.setProperty("hibernate.connection.password",
tripledesenc.decrypt(pwd));
sessionFactory = cfg.buildSessionFactory();
System.out.println("cfg: " + cfg);
System.out.println("sessionFactory: " + sessionFactory);
}
public Session getSession() {
System.out.println("Going to get session");
Session session = null;
try {
System.out.println("cfg is: " + cfg);
System.out.println("sessionFactory: " + sessionFactory);
session = sessionFactory.openSession();
if(session != null){
try {
Transaction trxn = session.beginTransaction();
Query queryResult = session.createSQLQuery("select * from dual");
List<GTS_USER>listgtsuser = queryResult.list();
} catch (Exception e) {
e.printStackTrace();
System.out.println("Creating new connection............");
session.close();
sessionFactory.close();
getConnection();
session = sessionFactory.openSession();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return session;
}
公共类ApplicationUtilityBean实现可序列化{
私人会话工厂会话工厂;
私有注释配置;
公共字符串文件路径;
私有字符串realPath=Config.PATH;
public ApplicationUtilityBean()抛出URI语法异常{
getConnection();
}
公共连接()无效{
URL r=this.getClass().getClassLoader().getResource(“hibernate.cfg.xml”);
cfg=新的AnnotationConfiguration();
配置(r);
字符串pwd=cfg.getProperty(“hibernate.connection.password”);
TripleDESEncryption tripledesenc=null;
试一试{
tripledesenc=新的TripleDESEncryption();
}捕获(例外e){
e、 printStackTrace();
}
setProperty(“hibernate.connection.password”,
三重加密解密(pwd));
sessionFactory=cfg.buildSessionFactory();
System.out.println(“cfg:+cfg”);
System.out.println(“sessionFactory:+sessionFactory”);
}
公共会话getSession(){
System.out.println(“准备获取会话”);
会话=空;
试一试{
System.out.println(“cfg为:+cfg”);
System.out.println(“sessionFactory:+sessionFactory”);
session=sessionFactory.openSession();
if(会话!=null){
试一试{
事务trxn=session.beginTransaction();
queryqueryresult=session.createSQLQuery(“select*from dual”);
listgtsuser=queryResult.list();
}捕获(例外e){
e、 printStackTrace();
System.out.println(“创建新连接……”);
session.close();
sessionFactory.close();
getConnection();
session=sessionFactory.openSession();
}
}
}捕获(例外e){
e、 printStackTrace();
}
返回会议;
}
}
我的hibernate配置文件是
<hibernate-configuration>
<session-factory>
<property name="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</property>
<property name="hibernate.cache.use_query_cache">true</property>
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@xxxxxxxxx:1521:HMS</property>
<property name="hibernate.connection.username">xxxxx</property>
<property name="hibernate.connection.password">xxxxxxxxxxx</property>
<property name="hibernate.connection.pool_size">10</property>
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.OracleDialect</property>
<property name="hibernate.hbm2ddl.auto">update</property>
net.sf.ehcache.hibernate.EhCacheRegionFactory
真的
真的
oracle.jdbc.OracleDriver
jdbc:oracle:thin:@xxxxxxxxx:1521:HMS
xxxxx
XXXXXXXXXX
10
真的
org.hibernate.dialen.oraclealent
更新
这里的问题是数据库服务器将关闭空闲连接。应用程序并不了解它,而是尝试使用过时的连接(来自初始化期间创建的池)。解决方法是,在使用连接池中的连接之前,配置连接池进行活动性测试(通常通过触发一个简单的select查询)
如何做到这一点取决于您如何设置数据源/连接池。如果您提供更多详细信息,我可以提供更具体的说明。您可能面临数据库连接超时。在每个数据库上,当连接打开并且在特定时间段内没有活动时,都会有一个超时。您需要一个连接池管理器 如果您安装
c3p0
并正确配置它,它将允许hibernate保持您的连接处于活动状态和/或在需要时重新打开它
这里有一个MySQL和Hibernate的示例,但它是相同的。您必须包括c3p0.jar
,并将其添加到您的hibernade配置文件中:
<property name="c3p0.min_size">5</property>
<property name="c3p0.max_size">20</property>
<property name="c3p0.timeout">1800</property>
<property name="c3p0.max_statements">50</property>
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
5
20
1800
50
org.hibernate.connection.C3P0ConnectionProvider
确保根据您的数据库配置c3p0.timeout
根据@BalusC
<>如果您的应用程序运行时间较长,并且经常连接数据库,那么请考虑使用连接池来改善连接性能。如果您的应用程序是一个webapplication,那么请查看appserver的文档,它通常提供一个数据源风格的连接池功能。如果它是一个客户端应用程序,那么请查找多年来证明其健壮性的第三方连接池库,例如Apache Commons DBCP(常用,用于lot appservers)、C3P0(从Hibernate知道)和Proxool(如果需要XA连接).您是在hibernate配置文件中指定数据库参数,还是使用was7中定义的数据源,并使用JNDI进行查找?仅在hibernate配置中指定db参数我只是在使用hibernate 3的defoult连接池。我已在hibernate.cfg.xml中设置了属性。我尝试了相同的方法,但不起作用。还有代码级别的更改吗?不客气,请将其标记为已回答,以便其他人知道它对您有帮助!