Java给方法设置超时

package com.sfpay.console.util;

......
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
......

/**
 * 类说明:<br>
 * 临时数据提取模块Handler
 * <p>
 * 详细描述:<br>
 * Common Util
 * </p>
 * @author 80003614 
 * CreateDate: 2018-12-3
 */
@Component("dataExtrComHandler")
public class DataExtrComHandler {

	......
	
	/**
	 * 执行sql查询,加载查询内容到内存
	 * @param connection 数据库连接对象
	 * @param querySql 要执行的sql语句
	 * @return
	 * @throws Exception
	 */
	public List<Object[]> executeDBQuery(final Connection connection, final String querySql) throws Exception {
		// 该处需防止内存溢出,后期应优化。
		// ArrayListHandler:将查询的结果,每一行先封装到Object数组中,然后将数据存入List集合
		ExecutorService executor = Executors.newSingleThreadExecutor();
		FutureTask<List<Object[]>> future = new FutureTask<List<Object[]>>(new Callable<List<Object[]>>() {
			@Override
			public List<Object[]> call() throws Exception {// 执行sql
				QueryRunner queryRunner = new QueryRunner();
				List<Object[]> data = queryRunner.query(connection, querySql, new ArrayListHandler());
				// Thread.sleep(11000);
		
				return data;
			}
		});
		String exeSqlTimeout = null;
		try {
			executor.execute(future);
			// 获取数据库规定的query timeout值
			//exeSqlTimeout = sysParaCfgMapper.selectParaValue("EXE-SQL-TIMEOUT-DURATION");
			List<Object[]> result = future.get(1000*60, TimeUnit.MILLISECONDS);
			return result;
		} catch (TimeoutException e) { // sql执行超时
			throw new TimeoutException(
					"Sql执行超时!系统规定Sql执行时间不能超过" + (Long.parseLong(exeSqlTimeout) / 1000 / 60) + "分钟...");
		} catch (Exception e) {
			throw new RuntimeException("Sql执行异常:" + e.getMessage());
		} finally {
			future.cancel(true);
			executor.shutdown();
		}
	}
	
	......

}	

来源:https://blog.csdn.net/ithouse/article/details/78257418

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值