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());
}
数据库得连接bu'yao放在循环里。
这段代码有数据库表查询 和 表插入或者更新 。数据库表跟新的时候表会处于加锁状态,此处代码是循环跟新或者插入一张表。有可能会导致并发更新。
表在未完成上一次更新操作的时候继续更新表。会因锁引发线程阻塞。导致循环阻塞。
感觉一楼说的对,你这个数据库的最大连接数是多少,能经得起你这样不断获取连接
改用把查询出来的数据先放到集合里,查询结束后,再开启一个连接进行更新操作
只需获取一次Connection 使用这个链接对象即可,做CRUD操作,操作结束后关闭该链接。
Connection conn =getConnection();//获取连接对象
try{
...
你的增删改查操作
...
}finally{
conn.close();
}
closeConn(null, pstmtProfit, rsProfit);这个关闭链接放在for循环中,运行第二遍时 链接已经关闭了。这个关闭放到finally比较好
其实可以参考线现在的数据库连接工具,例如德鲁伊等等.我们在连接数据库的时候,是有默认的或定义好的连接数.编不下去了.楼上说的都对
开发爽,运维死
这种模式很难调试,楼上说的好,做封装吧!