定时器有执行,但是里面的方法没有正常执行,也没有发现报错

提问 未结 3 43
开心笑耶
开心笑耶 2019-05-13
悬赏:20积分
版本:renren-security 1.1 浏览器:谷歌
虽然我提的问题有点大,但是还是想提一下 1、在使用定时器的时候,点击立刻执行,方法执行一些正常; 2、在11:10修改corn表达式为(0 22 11 * * ?)的时候也正常执行,但是把它修改到(0 0 23 * * ?)作者(0 30 1 * * ?)的时候,定时器有执行,但是里面的方法就没有执行正常; 3、方法中只报了这些问题:但是点击立刻执行的时候也会报这些问题,但是可以正常执行而将定时器修改为(0 0 23 * * ?)作者(0 30 1 * * ?),就只能执行定时器,而方法不能正常之 心 ORA-01000: 超出打开游标的最大数 ORA-00604: 递归 SQL 级别 1 出现错误 ORA-01000: 超出打开游标的最大数 ORA-01000: 超出打开游标的最大数 4、下面是我的源码(功能是将数据同mysql同步到oracle中) public void mysqlToOracle(String params) { JSONObject jsonObject = JSONObject.parseObject(params); int days = jsonObject.getInteger("days"); logger.info("开始新闻同步,正在被执行,参数为:" + days); Connection con = null;// 创建一个数据库连接 PreparedStatement pre = null;// 创建预编译语句对象,一般都是用这个而不用Statement ResultSet result = null;// 创建一个结果集对象 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date1 = new Date(); String begin_time = sdf.format(date1); long startTime = System.currentTimeMillis(); Date date2 = null; String end_time = null; long endTime; String sync_time; String sync_table = "cms_article_sjzhmh"; int sync_type = 1; try { // Class.forName("com.mysql.jdbc.Driver");// 加载Oracle驱动程序 // String url = mysqlurl; // String user = mysqlname;// 用户名,系统默认的账户名 // String password = mysqlpassword;// 你安装时选设置的密码 // con = DriverManager.getConnection(url, user, password);// 获取连接 con = secondDataSource.getConnection(); logger.info("连接mysql数据户成功"); Date date = new Date(); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.DAY_OF_MONTH, -days);//添加days参数,表示同步多少天前之后的数据 //calendar.set(Calendar.HOUR,calendar.get(Calendar.HOUR) - 4); date = calendar.getTime(); String nowDate = sdf.format(date); logger.info("当前系统时间为:" + nowDate); String sql = "select * from cms_article_sjzhmh t where 1=1 and create_time >= " + "'" + nowDate + "'";// 预编译语句,“?”代表参数 logger.info("查询mysql的sql语句:" + sql); pre = con.prepareStatement(sql);// 实例化预编译语句 result = pre.executeQuery();// 执行查询,注意括号中不需要再加参数 importData(result, begin_time, startTime, sync_table); } catch (Exception e) { logger.error("查询cms_article_sjzhmh出错:"+e); e.printStackTrace(); } finally { try { // 逐一将上面的几个对象关闭,因为不关闭的话会影响性能、并且占用资源 // 注意关闭的顺序,最后使用的最先关闭 if (result != null) result.close(); if (pre != null) pre.close(); if (con != null) con.close(); } catch (Exception e) { e.printStackTrace(); } } } public String importData(ResultSet result, String begin_time, long startTime, String sync_table) { Date date2 = null; String end_time = null; long endTime; long syncTime; String sync_time = null; int success_num = 0; int fail_num = 0; String failure_result = null; int sync_type = 1; Connection con = null;// 创建一个数据库连接 PreparedStatement pre = null;// 创建预编译语句对象,一般都是用这个而不用Statement Timestamp currentTime = new Timestamp(System.currentTimeMillis()); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String begingTime = formatter.format(currentTime); try { logger.info("开始连接oracle数据库,准备插入数据cms_article"); con = firstDataSource.getConnection(); while (result.next()) { /*String id = getUUID(); String entryType = getEntryType(result .getString("CHANNEL_CODE"));*/ int data_type = 0; if (result.getString("data_type") != null) { if (result.getString("data_type").equals("null")) { data_type = 0; } else if (result.getString("data_type").equals("")) { data_type = 0; } else { data_type = Integer.parseInt(result.getString("data_type")); } } else { data_type = 0; } String sql = " insert into cms_article(aid,title,status,brief,img_url,content,release_time," + "source,author,is_top,display_type,menu_name,art_type,more_img,data_type,create_time,area_code) " + " values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; pre = con.prepareStatement(sql);// 实例化预编译语句 String content = result.getString("content"); Clob clob = con.createClob(); clob.setString(1,content); if (clob instanceof com.alibaba.druid.proxy.jdbc.ClobProxyImpl) { com.alibaba.druid.proxy.jdbc.ClobProxyImpl impl = (com.alibaba.druid.proxy.jdbc.ClobProxyImpl) clob; clob = impl.getRawClob(); // 获取原生的这个 Clob  } pre.setClob(6, clob); pre.setString(1, result.getString("aid")); pre.setString(2, result.getString("title")); pre.setInt(3, result.getInt("status")); pre.setString(4, result.getString("brief")); pre.setString(5, result.getString("img_url")); // pre.setClob(6, clob); pre.setString(7, result.getString("create_time"));//爬去时间 pre.setString(8, result.getString("source")); pre.setString(9, result.getString("author")); pre.setInt(10, result.getInt("is_top")); pre.setInt(11, result.getInt("display_type")); pre.setString(12, result.getString("menu_name")); pre.setString(13, result.getString("art_type")); pre.setString(14, result.getString("more_img")); pre.setInt(15, data_type); pre.setString(16, result.getString("release_time"));//发布时间 pre.setString(17, result.getString("area_code")); try { pre.execute(); success_num += 1; logger.info("插入成功第" + (success_num) + "条数据"); } catch (SQLException e) { fail_num += 1; sync_type = 0; failure_result = e.getMessage(); String art_id = result.getString("aid"); String art_title = result.getString("title"); String art_brief = result.getString("brief"); logger.error("插入第" + (success_num) + "条数据失败"); /*try { insertFailSql(art_id, art_title, art_brief, failure_result, begin_time); } catch (Exception e1) { e1.printStackTrace(); }*/ continue; } //pre.close(); } date2 = new Date(); end_time = formatter.format(date2); endTime = System.currentTimeMillis(); syncTime = endTime - startTime; sync_time = String.valueOf(syncTime) + "ms"; insertSql(begin_time, end_time, sync_time, sync_table, success_num, fail_num, sync_type, failure_result); } catch (Exception e) { e.printStackTrace(); logger.error("总插入oracle数据数据出错"); } finally { try { // 逐一将上面的几个对象关闭,因为不关闭的话会影响性能、并且占用资源 // 注意关闭的顺序,最后使用的最先关闭 if (result != null) result.close(); if (pre != null) pre.close(); if (con != null) con.close(); } catch (Exception e) { e.printStackTrace(); } } return null; } public void insertSql(String begin_time, String end_time, String sync_time, String sync_table, int success_num, int fail_num, int sync_type, String failure_result) { logger.info("财政新闻资讯同步日志,正在被执行"); Connection con = null;// 创建一个数据库连接 PreparedStatement pre = null;// 创建预编译语句对象,一般都是用这个而不用Statement try { con = firstDataSource.getConnection(); ProfileUtil profileUtil = new ProfileUtil(); long log_sync_id = profileUtil.getAtomicCounter(); String sql = " insert into cms_sync_log (log_sync_id,begin_time,end_time,sync_time,sync_table,success_num,fail_num,sync_type,failure_result) " + " values ('" + log_sync_id + "', '" + begin_time + "','" + end_time + "','" + sync_time + "','" + sync_table + "','" + success_num + "','" + fail_num + "','" + sync_type + "','" + failure_result + "') "; pre = con.prepareStatement(sql);// 实例化预编译语句 logger.info("日志sql语句:" + sql); pre.executeUpdate(); //result = pre.executeQuery();// 执行查询,注意括号中不需要再加参数 } catch (Exception e) { logger.error("同步日志出错"); e.printStackTrace(); } finally { try { if (pre != null) pre.close(); if (con != null) con.close(); } catch (Exception e) { e.printStackTrace(); } } } 盼望指教,万分感谢!img[//cdn.renren.io/cbcc5201905131141048556.png]
回帖
  • 感觉像是任务的业务代码异常,可以先跑一个空的定时任务,打印一下日志,排除下问题
    0 回复
  • 开心笑耶
    2019-05-13
    我单独设定一个时间去跑是没有问题的,这个业务也没有报错,也能正常同步数据,设定每天晚上跑一次的时候,定时器是执行了,就是里面的业务没有执行,如果是业务代码异常的话,点击立刻执行按钮也应该报错才是,这样打印日志也好排除,而点击【立刻执行】按钮却能正常执行业务代码同步数据,这就是我郁闷和不理解的原因!
    0 回复
  • 开心笑耶
    2019-05-13
    @Mark 我单独设定一个时间去跑是没有问题的,这个业务也没有报错,也能正常同步数据,设定每天晚上跑一次的时候,定时器是执行了,就是里面的业务没有执行,如果是业务代码异常的话,点击立刻执行按钮也应该报错才是,这样打印日志也好排除,而点击【立刻执行】按钮却能正常执行业务代码同步数据,这就是我郁闷和不理解的原因!
    0 回复