在jfinal項目中使用定時任務quartz如果自行得到 DataSource 或 Connection ,背景會一直抛異常:
com.jfinal.plugin.activerecord.ActiveRecordException: com.alibaba.druid.pool.DataSourceClosedException: dataSource already closed at Tue Sep 19 18:00:27 CST 2017
at com.jfinal.plugin.activerecord.DbPro.find(DbPro.java:315)
at com.jfinal.plugin.activerecord.DbPro.find(DbPro.java:326)
at com.jfinal.plugin.activerecord.Db.find(Db.java:233)
at com.sxjlrj.sys.model.ExpertMailModel.ge
4000
tMail(ExpertMailModel.java:22)
at com.sxjlrj.timmer.SendMsgForPersonTimmer.execute(SendMsgForPersonTimmer.java:39)
at org.quartz.core.JobRunShell.run(JobRunShell.java:206)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:548)
Caused by: com.alibaba.druid.pool.DataSourceClosedException: dataSource already closed at Tue Sep 19 18:00:27 CST 2017
at com.alibaba.druid.pool.DruidDataSource.getConnectionInternal(DruidDataSource.java:676)
at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:603)
at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:587)
at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:577)
at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:78)
at com.jfinal.plugin.activerecord.Config.getConnection(Config.java:161)
at com.jfinal.plugin.activerecord.DbPro.find(DbPro.java:312)
... 6 more
原因是:因為在定時器中手動擷取了 DataSource,然後使用後關閉了或者用完後長期不再用被連接配接池自動關閉
解決方法是:jfinal中使用定時任務,操作資料庫時,盡量使用Db+Record模式進行操作
例如:
//更新郵件記錄表的郵件發送時間 和狀态
Record email = Db.findById("DT_EXPERT_MAIL", msg.get("ID"));
email.set("SEND_DATE", Timestamp.valueOf(DateUtil.getNow()));
email.set("STATUS", 1);
Db.update("DT_EXPERT_MAIL", email);
另外,config配置檔案添加對druid插件的操作:
//資料庫連接配接
DruidPlugin druidPlugin = new DruidPlugin(getProperty("url"), getProperty("user"), getProperty("password").trim(),getProperty("driverClass"));
druidPlugin.setMinIdle(5)
.setTimeBetweenEvictionRunsMillis(6*1000)
//.setValidationQuery("select 1")
.setTestWhileIdle(true)
.setTestOnBorrow(true)
.setTestOnReturn(true)
.setMaxPoolPreparedStatementPerConnectionSize(20);
me.add(druidPlugin);
這樣背景就不會抛異常了。