天天看點

jfinal mysql 連接配接數耗盡_jfinal使用定時任務quartz操作資料庫抛出異常:com.alibaba.druid.pool.DataSourceClosedException: dat...

在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);

這樣背景就不會抛異常了。