FineReport报表使用了sqlserver数据连接,过一段时间后报表取数异常

我配置了sqlserver的数据连接,sqlserver版本为2016。

连接参数目前为:

连接池属性原默认就出现同样的错误,我增大了一些参数。故障依旧。比如昨天晚上11点多执行报表还显示正常的。现在8点40多分执行就报如下错误:

不仅仅是这个数据源的报表会出错,另外一个sqlserver数据源制作的报表同样错误。

每次出现错误后,重启服务器的web服务后,报表再刷新就显示正常。

log目录下日志,在出错的时候显示如下:

08:42:20 http-nio-37799-exec-7 INFO [standard] 合同/合同汇总统计表.cpt Start to execute report session ba3a05ec-6a1e-4e81-8287-0ed88cf85e62. 08:42:20 http-nio-37799-exec-7 INFO [standard] 合同/合同汇总统计表.cpt 开始计算报表 08:42:20 http-nio-37799-exec-7 INFO [standard] 合同/合同汇总统计表.cpt 开始执行自定义函数GetPermissionDepts 08:42:27 http-nio-37799-exec-6 INFO [standard]  client 8053553b-979b-4527-a6cb-c013211ca85d prolong life 08:42:30 http-nio-37799-exec-7 ERROR [standard] 合同/合同汇总统计表.cpt 错误代码:31300012 创建数据连接失败: wait millis 10000, active 50, maxActive 50 08:42:30 http-nio-37799-exec-7 ERROR [standard] 合同/合同汇总统计表.cpt 自定义函数GetPermissionDepts异常,wait millis 10000, active 50, maxActive 50 08:42:30 http-nio-37799-exec-7 INFO [standard] 合同/合同汇总统计表.cpt [SQL]SQL: select * from Contract where 1=1    and 生效日期<='2021-12-31'    and 合同状态 ='生效态'    and 合同总金额-合同收付金额-合同预收付金额 >=1    order by 合同编码 asc 08:42:30 http-nio-37799-exec-7 INFO [com.fr.third.alibaba.druid.pool.DruidDataSource] 合同/合同汇总统计表.cpt {dataSource-15} closed 08:42:30 http-nio-37799-exec-7 INFO [com.fr.third.alibaba.druid.pool.DruidDataSource] 合同/合同汇总统计表.cpt {dataSource-16} inited 08:42:30 http-nio-37799-exec-7 INFO [standard] 合同/合同汇总统计表.cpt sql time: 349 ms!

FineReport hugeng 发布于 2021-4-8 08:58
1min目标场景问卷 立即参与
回答问题
悬赏:13 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共2回答
最佳回答
0
Z4u3z1Lv6专家互助
发布于2021-4-8 09:11

恢复默认设置试试

image.png

  • hugeng hugeng(提问者) 因为默认先出现同样的故障,才想着去试着修改这个默认的参数项。 所以改回默认项是没有意义的。
    2021-04-08 10:14 
  • Z4u3z1 Z4u3z1 回复 hugeng(提问者) 08:42:30 http-nio-37799-exec-7 ERROR [standard] 合同/合同汇总统计表.cpt 自定义函数GetPermissionDepts异常 是不是有个GetPermissionDepts函数? 这个干嘛的?方便贴出来不?
    2021-04-08 10:21 
  • hugeng hugeng(提问者) 回复 Z4u3z1 这个自定义函数的作用是: 根据当前登录者的登录名,到自己的sqlserver数据库里,查询这个这个人对哪几个部门有浏览权限。返回是是 \'A部门\',\'B部门\' 这样的字符串。 然后报表的查询语句里,就 where 部门代码 in (${GetPermissionDepts($fine_username)}) public Object run(Object[] args) { if (null == args || args.length == 0) { return \"\'\'\"; } String allDepts = \"\"; FineLoggerFactory.getLogger().info(\"开始执行自定义函数GetPermissionDepts\"); String username = args[0].toString(); //当前登录的用户名 try { com.fr.data.impl.Connection conn = DBUtils.checkDBConnection(\"OA\"); //定义好的数据库连接 java.sql.Connection con = conn.createConnection(); String fieldName = \"\"; //OA部门矩阵表中,对应角色的人员字段 //遍历第2个参数到最后一个参数,各参数为角色名称 for (int i = 1; i < args.length; i++) { switch (args[i].toString()) { case \"部门经理\": fieldName = \"bmfzr\"; break; case \"一级部门经理\": fieldName = \"zzjgbmfzr\"; break; case \"分管副总\": fieldName = \"bmfgld\"; break; case \"部门商务\": fieldName = \"bmsw\"; break; default: //其余不认识的角色忽略 fieldName = \"\"; continue; } if (StringUtils.isNotEmpty(fieldName)) { String depts = getDeps(username, fieldName, con); if (StringUtils.isNotEmpty(depts)) allDepts += \",\" + depts; } } //所有角色都执行完毕了,去除重复的部门 allDepts = removeRepeatDept(allDepts); } catch (Exception e) { FineLoggerFactory.getLogger().error(\"自定义函数GetPermissionDepts异常,\" + e.getMessage()); } if (StringUtils.isNotEmpty(allDepts)) return allDepts; return \"\'\'\"; } 对于数据库的操作,使用了一个开源的第三方插件commons-dbutils-1.7.jar /** * 根据sql查询返回所有记录,以List数组形式返回 * * @param sql * @return */ public static List getListArray(Connection connection, String sql) { try { return new QueryRunner().query(connection, sql, new ArrayListHandler()); } catch (Exception ex) { ex.printStackTrace(); } return null; }
    2021-04-08 10:46 
  • Z4u3z1 Z4u3z1 回复 hugeng(提问者) 这个对我来说太深奥了。 猜测java.sql.Connection con = conn.createConnection(); 创建了一个连接,后面是否并没有释放它是不是?多使用/打开几次这个报表就不停的创建连接直到把50个活动占用完就报错。 不知道推断是否正确。。。。。
    2021-04-08 11:04 
  • hugeng hugeng(提问者) 回复 Z4u3z1 好像你的推断是正确的。我再测试一段时间看看。没问题的话给你加分。 开源的第三方插件commons-dbutils-1.7.jar ,在使用时,一是从配置文件中获取数据库连接,一个是传入一个connection 对象 。 对于后者,它在执行完Sql语句后,不会自动close,认为是传入的,所以需要调用它的代码自行完成Close动作。 而如果是前者,它会自行关闭。 所以,我修改了调用commons-dbutils-1.7.jar中的方法 new QueryRunner().query(connection, sql, new ArrayListHandler()); 在调用它之后,手工关闭connection对象。 刚才试着刷新了50次都正常的。
    2021-04-08 11:54 
最佳回答
0
snrtuemcLv8专家互助
发布于2021-4-8 09:06

你这个是链接数不够,最大活动链接数加到200,保持空闲最小时间值改成默认1800试试

image.png

  • 2关注人数
  • 733浏览人数
  • 最后回答于:2021-4-8 09:11
    请选择关闭问题的原因
    确定 取消
    返回顶部