jfinal使用定时任务quartz操作数据库抛出异常:com.alibaba.druid.pool.DataSourceClosedException: dataSource already clo

在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.getMail(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);

这样后台就不会抛异常了。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值