java jdbc查询卡住 在for循环到某一个的时候卡住了 5C

do {
YstAgentInfoPojo pojo = new YstAgentInfoPojo();
pojo.setAgtMerId(rsAll.getString(1));
pojo.setAgtName(rsAll.getString(2));
pojos.add(pojo);

                } while (rsAll.next());

                //关闭查询代理商连接,重新获得连接
                closeConn(conn, psAll, rsAll);
                //重新获得连接
                conn = YstManagerConnFactory.getConn();
                for (YstAgentInfoPojo agent : pojos) {
                    logger.info("----->代理商查询月报表start" + agent.getAgtMerId());
                    pstmtProfit = conn.prepareStatement(Configure
                            .getProperty("agent.profit.withdraw.month.sql1"));
                    pstmtProfit.setString(1, agent.getAgtMerId());
                    pstmtProfit.setString(2, agent.getAgtMerId());
                    pstmtProfit.setString(3, acdt.substring(0,6));
                    rsProfit = pstmtProfit.executeQuery();
                    logger.info("----->代理商查询月报表end");
                    while (rsProfit.next()) {
                        logger.info("---------->insert month report start:" + agent.getAgtMerId() + " ," + rsProfit.getString(1));
                        SpringContext.getBean(IYstManagerAgentProfitDao.class).saveAgentMonthProfit(agent.getAgtMerId(), agent.getAgtName(), rsProfit.getString(1),
                                rsProfit.getString(2), rsProfit.getString(3),rsProfit.getString(4),String.valueOf(rsProfit.getDouble(5)),
                                String.valueOf(rsProfit.getDouble(6)), String.valueOf(rsProfit.getDouble(7)), "0");
                        logger.info("---------->insert month report end:" + agent.getAgtMerId() + "," + rsProfit.getString(1));
                    }
                    logger.info("代理商月提现分润(不包含下级)遍历:" + agent.getAgtMerId());
                    closeConn(null, pstmtProfit, rsProfit);
                    logger.info("代理商月提现分润(不包含下级)遍历关闭陈述:" + agent.getAgtMerId());

                }
qq_16127313
爱码少年 代码好好封装吧。过程式思维编程写法不可取
一年多之前 回复

9个回答

数据库得连接bu'yao放在循环里。

这段代码有数据库表查询 和 表插入或者更新 。数据库表跟新的时候表会处于加锁状态,此处代码是循环跟新或者插入一张表。有可能会导致并发更新。
表在未完成上一次更新操作的时候继续更新表。会因锁引发线程阻塞。导致循环阻塞。

感觉一楼说的对,你这个数据库的最大连接数是多少,能经得起你这样不断获取连接

改用把查询出来的数据先放到集合里,查询结束后,再开启一个连接进行更新操作

只需获取一次Connection 使用这个链接对象即可,做CRUD操作,操作结束后关闭该链接。

 Connection conn  =getConnection();//获取连接对象

 try{
 ...
 你的增删改查操作
 ...
 }finally{
 conn.close();
 }

  1. 检查循环逻辑,自己控制连接其实是很有难度的事情
  2. 试一试jdk1.7以后新增的资源异常管理语法try-with-resource来做自动关闭,题目代码里那样自己写一个close的手工调用十分不可靠

closeConn(null, pstmtProfit, rsProfit);这个关闭链接放在for循环中,运行第二遍时 链接已经关闭了。这个关闭放到finally比较好

其实可以参考线现在的数据库连接工具,例如德鲁伊等等.我们在连接数据库的时候,是有默认的或定义好的连接数.编不下去了.楼上说的都对

开发爽,运维死
这种模式很难调试,楼上说的好,做封装吧!

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐