大概说下我现在的程序
一个BasaDao,大概如下
public class BaseDao<T> extends HibernateDaoSupport { private Configuration conf;
private HibernateTemplate ht;
private SessionFactory sessionFactory; public BaseDao() {
conf = new Configuration().configure();
sessionFactory = conf.buildSessionFactory();
ht = new HibernateTemplate(sessionFactory);
}
各种增删改查方法省略
}
然后有各种Dao继承这个BaseDao,这些Dao都是针对数据库里的每个表实现。
我启动一个定时器,并在初始化方法里,初始化一个Dao,每隔30s会检查缓存,然后取出其中的数据使用,Dao将其存入数据库中的表A,同时我会启动定时器,每隔半小时,将数据库里表A的数据删除,执行处理数据并保存数据库的线程入下:
public class VehicleDetectQuartzJob implements Job { private VehicleDetectDao dao = null; public VehicleDetectQuartzJob() {
dao = new VehicleDetectDao();
} public void execute(JobExecutionContext context)
throws JobExecutionException {
        // 此处从缓存中取出数据,然后使用dao将其保存
        }
}
执行删除数据库的定时器类如下:
public class VehicleDetectQuartzJob implements Job { private VehicleDetectDao dao = null; public VehicleDetectQuartzJob() {
dao = new VehicleDetectDao();
}
        public void execute(JobExecutionContext context)
throws JobExecutionException {
        // 此处执行调用dao执行删除操作
        }
}
数据库是Oracle11g,但是我运行一段时间后,出现如下错误:
java.sql.SQLRecoverableException: Io 异常: The Network Adapter could not establish the connection
at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:101)
at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:173)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:229)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:458)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:411)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:490)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:202)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:33)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:474)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at org.hibernate.connection.DriverManagerConnectionProvider.getConnection(DriverManagerConnectionProvider.java:110)
at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:76)
at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2006)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1289)
at com.traffic.rest.dao.BaseDao.<init>(BaseDao.java:47)
at com.traffic.rest.dao.VehicleDetectDao.<init>(VehicleDetectDao.java:13)
at com.traffic.mina.thread.VehicleDetectQuartzJob.<init>(VehicleDetectQuartzJob.java:31)
at sun.reflect.GeneratedConstructorAccessor20.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at org.quartz.simpl.SimpleJobFactory.newJob(SimpleJobFactory.java:50)
at org.quartz.core.JobRunShell.initialize(JobRunShell.java:133)
at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:353)

解决方案 »

  1.   

    出错的地方就在执行删除的定时器的初始化Dao这里
    public VehicleDetectQuartzJob() {
            dao = new VehicleDetectDao();
        }
    如果之前我已经初始化一个dao,并且会一直保持连接,然后定时执行另外一个任务,初始化同一个dao,然后狮子那个操作,这样行么?
      

  2.   

    你这样不停地new连接会耗尽的
      

  3.   

    那应该怎么解决啊?每次执行操作后我执行关闭,把sessionfactory关闭行么?
    麻烦了~