程序执行大概4小时候出错,之前一直正常,该关闭的连接都关闭了,因为程序是定时执行的,经测试和运行次数无关java.sql.SQLException: 关闭的连接
        at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
        at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
        at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:269)
        at oracle.jdbc.driver.OracleConnection.privatePrepareStatement(OracleConnection.java:895)
        at oracle.jdbc.driver.OracleConnection.prepareStatement(OracleConnection.java:802)
        at sun.reflect.GeneratedMethodAccessor8.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.logicalcobwebs.proxool.ProxyConnection.invoke(ProxyConnection.java:68)
        at org.logicalcobwebs.cglib.proxy.Proxy$ProxyImpl$$EnhancerByCGLIB$$355c63a8.prepareStatement(<generated>)
        at com.anyi.erp.inf.bus.AppInf.selectAddDbi(AppInf.java:1551)
        at com.anyi.erp.inf.socket.StartBudgetBalance.go(StartBudgetBalance.java:112)
        at com.anyi.erp.inf.socket.StartBudgetBalance.run(StartBudgetBalance.java:53)
        at java.util.TimerThread.mainLoop(Timer.java:512)
        at java.util.TimerThread.run(Timer.java:462)获取连接的方法
public static Connection getConn() throws Exception{

int type = 2;//1为正式环境连接,2为测试模式连接
Connection conn = null;

if (type == 1) {

    //conn = InterfaceDAOFactory.getInstance().getConnection();

}else{

                try {
            conn = InterfaceHibernateSessionFactory.getSession().connection();//自己写连接池
            System.out.println(conn);
        } catch (Exception ex) {
        
            ex.printStackTrace();
        }
        
}
        if (conn == null) {
         throw new Exception("数据库连接中断!");
}
        
        return conn;

  }hibernate3加载proxool.xml,版本0.8.3
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory>
<property name="hibernate.connection.provider_class">org.hibernate.connection.ProxoolConnectionProvider</property>
<property name="hibernate.proxool.pool_alias">INTERDBPool</property>
<property name="hibernate.proxool.xml">interfaceproxool.xml</property>
<property name="show_sql">false</property>
<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
</session-factory></hibernate-configuration>
连接池配置文件
<?xml version="1.0" encoding="UTF-8"?>
<something-else-entirely>
<proxool>
<alias>INTERDBPool</alias>
<driver-url>jdbc:oracle:thin:@127.0.0.1:1521:db</driver-url>
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<driver-properties>
<property name="user" value="zbjk" />
<property name="password" value="1" />
</driver-properties>
<house-keeping-sleep-time>90000</house-keeping-sleep-time>
<prototype-count>10</prototype-count>
<maximum-connection-count>10</maximum-connection-count>
<minimum-connection-count>2</minimum-connection-count>
<maximum-active-time>30000</maximum-active-time>
</proxool>
</something-else-entirely>

解决方案 »

  1.   

    楼主试试c3p0吧,可以解决连接空闲超过4小时或8小时后被数据库自己关闭造成的错,我目前就用的c3p0+hibernate。
      

  2.   

    百度谷歌上有,hibernate中配置c3p0的例子,配置文件上的改动将不会超过20行,另外还需c3p0相关jar包支持,即可。<!-- C3P0连接池设定-->
    <property name="hibernate.connection.provider_class">
    org.hibernate.connection.C3P0ConnectionProvider
    </property>
    <property name="hibernate.c3p0.max_size">
    200
    </property>
    <property name="hibernate.c3p0.min_size">
    5
    </property>
    <property name="hibernate.c3p0.timeout">
    120
    </property>
    <property name="hibernate.c3p0.max_statements">
    100
    </property>
    <property name="hibernate.c3p0.idle_test_period">
    120
    </property>
    <property name="hibernate.c3p0.acquire_increment">
    2
    </property>
      

  3.   

    数据库关闭了连接还是这个proxool关的?
      

  4.   

    对了,后台定时运行的程序,推荐用oracle的job(10g后称为schedule)来作。
      

  5.   


    myConn = interfaceDbUtil.getConn();
    mySt = myConn.prepareStatement(sSQL);是从mySt = myConn.prepareStatement(sSQL)这句报的错,数据库是9i的,我配了2个连接池,分别连接同一个数据库实例里的2个用户,结果4小时左右都报错了,都是mySt = myConn.prepareStatement(sSQL)出错,错误的信息完全一样
      

  6.   


    程序是用JAVA的timer来设定时间定时执行的,对oracle不怎么会用,没仔细研究过