关于Jfinal定时任务异常

关于Jfinal配合quartz进行定时任务。数据源用的是Druid,经常出现数据源连接超时,网上说用Jfinal Db+Record 模式就可以解决该问题,我所有定时任务用的都是Jfinal Db+Record 模式 ,但是还是经常出现以下报错,问题并没有解决,
druid配置如下:

@Override
	public void configPlugin(Plugins me) {
		/**配置druid数据连接池插件**/
		DruidPlugin dp = new DruidPlugin(PropKit.get("jdbcUrl"), PropKit.get("user"), PropKit.get("password"),PropKit.get("driverClass"));
		dp.setMaxActive(30).
		setInitialSize(1)
		.setMaxWait(60000)
		.setMinIdle(5).setTimeBetweenEvictionRunsMillis(6000)
		.setMinEvictableIdleTimeMillis(300000)
		.setValidationQuery("SELECT 'x'")
		.setTestWhileIdle(true).
		setTestOnBorrow(false).
		setTestOnReturn(false).
		setFilters("stat").
		/**配置druid监控**/
		addFilter(new StatFilter()).//sql监控
		addFilter(new WallFilter()).//防止sql注入
	    setMaxPoolPreparedStatementPerConnectionSize(20);
		WallFilter wall=new WallFilter();
		wall.setDbType("mysql");
		dp.addFilter(wall);
		me.add(dp);
		
		ActiveRecordPlugin arp = MyDB.loadTableConfig(dp);
//		arp.setShowSql(true);
		me.add(arp);

定时任务代码如下:

@Scheduled(fixedDelay = 1000 * (60 * 60 * 1))
// 间隔一个小时执行
/* @Scheduled(cron="0 0 0 * * ?") */// 固定时间执行
public class SysAdopt implements Job {
	private static Log logger = LogFactory.getLog(SysAdopt.class);

	@Override
	public void execute(JobExecutionContext arg) throws JobExecutionException {

		try {
			// 查询所有系统选择的问题
			Date beginDate = new Date();
			Calendar date = Calendar.getInstance();
			date.setTime(beginDate);
			date.set(Calendar.DATE, date.get(Calendar.DATE) - 1);
			String endDate = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(date.getTime());
			logger.info("之前的时间===" + endDate);
//			List<Question> questions =Question.dao.queryForList("*", "selectType = 1 and createDate<= ? and state = 0", endDate);
			List<Record> questions = Db.find("select * from question where selectType = 1 and createDate<= ? and state = 0", endDate),
					orderlist=Db.find("select paymentNo,orderNo,type from order_table where state=1 and paymentNo is not null and wxOrder is null");
			logger.info("系统选择问题  定时任务测试开始===");
			for (Record question : questions) {
				UserPriceUtil.calculatingUserAmount(question);
			}
			if(StringUtil.isNotEmpty(orderlist)){
				List<OrderTable> list=new ArrayList<>();
				OrderTable order;
				boolean useCert;
				for (Record o : orderlist) {
					useCert=o.getInt("type")==2;
					Map<String, String> wxOrder= PaymentApi.orderQuery(o.get(useCert?"orderNo":"paymentNo"),useCert);
					order=new OrderTable();
					order.set("wxOrder", JSONObject.toJSONString(wxOrder));
					order.set("paymentNo", o.get("paymentNo"));
					order.set("orderNo", o.get("orderNo"));
					list.add(order);
				}
				Db.batch("update order_table set wxOrder =? where paymentNo=? and orderNo=?", "wxOrder, paymentNo,orderNo", list, list.size());
			}
			logger.info("系统选择问题  定时任务结束===");
		} catch (Exception e) {
			logger.error("定时任务系统选择问题异常:",e);
		}
	}
}
2018:04:20:15:56:17 ERROR [com.admin.util.quartz.SysAdopt] (SysAdopt.java:47) - 定时任务系统选择问题异常:
com.jfinal.plugin.activerecord.ActiveRecordException: com.alibaba.druid.pool.DataSourceClosedException: dataSource already closed at Mon Apr 16 13:59:58 CST 2018
        at com.jfinal.plugin.activerecord.Model.find(Model.java:565)
        at com.admin.model.MyDB.find(MyDB.java:69)
        at com.admin.model.MyDB.queryForList(MyDB.java:82)
        at com.admin.util.quartz.SysAdopt.execute(SysAdopt.java:40)
        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 Mon Apr 16 13:59:58 CST 2018
        at com.alibaba.druid.pool.DruidDataSource.getConnectionInternal(DruidDataSource.java:1057)
        at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:960)
        at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4544)
        at com.alibaba.druid.filter.FilterAdapter.dataSource_getConnection(FilterAdapter.java:2723)
        at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4540)
        at com.alibaba.druid.filter.stat.StatFilter.dataSource_getConnection(StatFilter.java:661)
        at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4540)
        at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:938)
        at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:930)
        at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:102)
        at com.jfinal.plugin.activerecord.Config.getConnection(Config.java:161)
        at com.jfinal.plugin.activerecord.Model.find(Model.java:562)
        ... 5 more


评论区

lyh061619

2018-04-20 16:46

首先你的这个异常不管你用Db+Record还是 Generator与JavaBean都会出现,这个跟你用哪种模式没关系,其次Druid连接超时问题,建议你去看下Druid的官方文档,上有说明,另外提供下模板如:
//解决BAE3.0 mysql公有数据库30秒断连接限制
druidPlugin.setTestWhileIdle(true);
druidPlugin.setTestOnBorrow(true);
druidPlugin.setTestOnReturn(true);拿去调试下。

eddiechow

2018-06-20 00:19

哥们儿解决了这个问题么?我也是遇到了;但是最奇怪的是,我本地运行调试的时候都正常,开启10个线程去使用 new XXModel().save() 或者 update() 都可以,但是一部署到服务器上就报 【dataSource already closed】这个错误;太奇怪了,代码是一样的,连接的数据库是同一个数据库(通过ip连接的),DruidPlugin的配置也是一样的。。。不知道怎么办了

eddiechow

2018-06-20 00:20

@JFinal 望波总百忙之中答疑解惑

eddiechow

2018-06-20 00:26

@lyh061619 【Druid连接超时问题,建议你去看下Druid的官方文档】文档上并没有找到类似的说明呢;还请指路这种多线程处理需要怎么操作,我的场景大概是后台有个Socket Server,接收客户端上传文件,可能有多个客户端同时上传,我模拟了10个客户端(线程)一起访问后台服务,去操作数据库就出现这个问题了。。。

热门反馈

扫码入社