异常Not able to obtain connection的解决办法

 最近在练兵的时候碰到这个问题,在网上搜罗了一大遍,碰到这个问题的网友还真不少,在此做个备忘,
 
也分析一下出现这种异常的原因。
 
  我的问题出现在Action中,我用的Action类型为DispatchAction,DispatchAction的特点就是通过配
 
置Action标签的parameter为method,然后在Action中直接定义多个业务方法,不同业务调用的是同一个
 
Action,只要加一个method的参数(参数值即为此业务方法在Action中的方法名)即可,调用的URL类似为:
 
**Action.do?method=setManageRoles,关于DispatchAction我就不多讲了,不清楚的可以参考Struts的
 
相关书籍和资料。
 
以下是我报异常的代码:

package struts.action;
import manage.UserManage;
import ..........
 
public class RolesModifyAction extends DispatchAction {
 
 //全局变量
 UserManage um = new UserManage();
 
 RoleDao dao = new RoleDao();
 
 String page = "";
 
// 业务方法一
 public ActionForward setManageRoles(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) {
 
    for (int j = 0; j < mbrand.length; j++) {

        UserRole userrole = um.getUserRoleByUserName(mbrand[j]);

        userrole.setRoleid(1);

        dao.saveOrUpdate(userrole);
  
     .........

    }

     return mapping.findForward(page);

 }
 
 public ActionForward setAgentRoles(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) {   

    .........  

  return mapping.findForward(page); 
 
 }
 
        public ActionForward setNormalRoles(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) {

     .........  

  return mapping.findForward(page);
  
 }
 
  以上代码为一个设置用户权限的Action,包含三个业务方法,在Action的开头我定义了这三个业务方法
 
共用的几个全局变量,这样看也没什么不妥,并且在执行时,第一次总能执行成功,但接着执行第二次的时候
 
就会抛出异常。尝试调试了很多次,但都未能解决,最后只有请同事帮忙了,同事一看就指出了死结:在
 
Ation中要避免定义全局变量,要定义都只能定义只读类型的,如常量,因为一个请求到达Action后即实例化
 
这些变量,并只实例化一次,这样以上代码的其它业务方法调用时将不会再实例化。
 
总结:
 
  抛这个异常主要原因是在进行数据库操作时获取不到可用的连接,也就是说session已经关闭了。上面的
 
代码在执行第一次后(dao.saveOrUpdate(userrole);)已将session关闭了,注:我是利用过滤器控制事务的
 
提交与session的关闭的,每执行完一次请求,过滤器自动提交事务,然后关闭session。

解决办法就是将所有全局变量取消,全部移入至每个业务方法内,这样就没问题啦。因此若出现此异常就一定
 
是某段操作数据库的代码出现问题了,这段代码将数据库连接提前关闭了,只要揪出这段代码,再结合你的
 
相关业务逻辑调整就可解决了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
"Failed to obtain JDBC Connection"表示未能获取JDBC连接。这个错误可能有多个具体的报错信息和报错类型。一个可能的报错信息是"CLIENT PLUGIN AUTH is required",它表示需要客户端插件授权。另一个可能的报错信息是"报错:Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; spring.MyBatisExceptionTranslator.translateExceptionIfPossible ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)",这个报错信息显示了异常的传递和处理过程。无论具体的报错信息是什么,"Failed to obtain JDBC Connection"都表示在获取JDBC连接时发生了错误。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【解决报错】failed to obtain JDBC Connection](https://blog.csdn.net/twotwo22222/article/details/124410299)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [经验总结:突然没法连接数据库 Failed to obtain JDBC Connection](https://blog.csdn.net/chengqingshihuishui/article/details/118529578)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [【解决报错】Failed to obtain JDBC Connection](https://blog.csdn.net/weixin_43883815/article/details/109122690)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值