package util;import java.sql.*;
import java.util.Calendar;
import java.util.TimerTask;
import db.dbConn;
import db.dbConn2;import javax.servlet.ServletContext;
/**
* 继承 定时器任务类
*
*/
public class UpdateMKTStore extends TimerTask {
public UpdateMKTStore() {
super();
}
/** 这个代表7点之后执行任务 */
private static final int C_SCHEDULE_HOUR = 7;
private static boolean isRunning = false;
private ServletContext context = null;
public UpdateMKTStore(ServletContext context) {
this.context = context;
}
public void run() {
Calendar cal = Calendar.getInstance();
if (!isRunning) {
if (C_SCHEDULE_HOUR < cal.get(Calendar.HOUR_OF_DAY)) {
isRunning = true;
context.log("开始执行同步超市线下库存列表任务");
dbConn dbo=new dbConn(); //建立BBC库的数据库连接
dbConn2 dbo2=new dbConn2();//建立middle库的数据库连接
java.text.SimpleDateFormat simpleDateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
java.util.Date currentTime = new java.util.Date();
String time = simpleDateFormat.format(currentTime);
System.out.println(time);
int changeNum=0;
int notChangeNum=0;
try {
//查询全部的待同步商品id
String sql="select distinct item_id from sysmkt_store where flag =0 ";
ResultSet rs = dbo2.executeQuery(sql);
rs.last(); //移到最后一行
int rowCount = rs.getRow();//得到当前行号
rs.beforeFirst();
//System.out.println(rowCount);
for(int i = 1;i<rowCount+1;i++){//循环全部待同步的item_id
System.out.println(i);
if(rs.next()){
int m_item_id= rs.getInt(1);
String sql1="select item_id,item_store,sku_id,sku_store from sysmkt_store where item_id="+m_item_id+" ";
ResultSet rs1 = dbo2.executeQuery(sql1);
rs1.last(); //移到最后一行
int rowCount1 = rs1.getRow();//得到当前行号
rs1.beforeFirst();
int flag = 0;//初始化标识符0:可同步;1不可同步
for(int j = 1;j<rowCount1+1;j++){//循环该item_id下的全部sku_id
if(rs1.next()){
int m_sku_id= rs1.getInt(3);
int m_sku_store= rs1.getInt(4);
String sql2="select freez from sysitem_sku_store where sku_id="+m_sku_id+" ";
ResultSet rs2 = dbo.executeQuery(sql2);
while(rs2.next()){
int b_freez= rs2.getInt(1);
if(b_freez > m_sku_store){
//比较冻结库存与待修改库存大小
flag = 1;
}
}
rs2.close();
//dbo.closeConection();
}
}
if (flag==0){
rs1.beforeFirst();
for(int j = 1;j<rowCount1+1;j++){
if(rs1.next())
{
changeNum++;
int c_item_id= rs1.getInt(1);
int c_item_store= rs1.getInt(2);
int c_sku_id= rs1.getInt(3);
int c_sku_store= rs1.getInt(4);
String sql3 = "update sysitem_item_store set store="+c_item_store+" where item_id="+c_item_id+"";
int rs3=dbo.executeUpdate(sql3);
String sql4 = "update sysitem_sku_store set store= "+c_sku_store+" where sku_id= "+c_sku_id+"";
int rs4=dbo.executeUpdate(sql4);
String sql5 = "update sysmkt_store set flag=1,modified_time='"+time+"',reason='' where sku_id="+c_sku_id+"";
int rs5=dbo2.executeUpdate(sql5);
}
}
}
if (flag==1){
rs1.beforeFirst();
for(int j = 1;j<rowCount1+1;j++){
if(rs1.next())
{
notChangeNum++;
int n_sku_id= rs1.getInt(3);
String sql6 = "update sysmkt_store set flag=2,modified_time='"+time+"',reason='商品库存小于当前冻结库存' where sku_id="+n_sku_id+"";
int rs6=dbo2.executeUpdate(sql6);
}
}
}
rs1.close();
}
}
if (changeNum==0){
System.out.println(time+":当期无库存修改");
}
else{
System.out.println(time+":当期修改:"+changeNum+"条库存记录,未修改库存记录:"+notChangeNum+"共计"+rowCount+"条记录");
}
rs.close();
} catch (SQLException e) {
System.err.println(e.getMessage());
}
finally{
dbo.closeConection();
dbo2.closeConection();
}
isRunning = false;
context.log("指定任务执行结束");
}
} else {
context.log("上一次任务执行还未结束");
}
}
} 这个大致是从middle库读取全部的商品列表,然后去BBC库比对商品的冻结库存,大于冻结库存才可以修改库存。
这个逻辑大体上是没什么问题,就是不知道为啥,debug 的时候经常出现[toString() unavailable - no suspended threads]这个错误,跪求大神给予解答啊
import java.util.Calendar;
import java.util.TimerTask;
import db.dbConn;
import db.dbConn2;import javax.servlet.ServletContext;
/**
* 继承 定时器任务类
*
*/
public class UpdateMKTStore extends TimerTask {
public UpdateMKTStore() {
super();
}
/** 这个代表7点之后执行任务 */
private static final int C_SCHEDULE_HOUR = 7;
private static boolean isRunning = false;
private ServletContext context = null;
public UpdateMKTStore(ServletContext context) {
this.context = context;
}
public void run() {
Calendar cal = Calendar.getInstance();
if (!isRunning) {
if (C_SCHEDULE_HOUR < cal.get(Calendar.HOUR_OF_DAY)) {
isRunning = true;
context.log("开始执行同步超市线下库存列表任务");
dbConn dbo=new dbConn(); //建立BBC库的数据库连接
dbConn2 dbo2=new dbConn2();//建立middle库的数据库连接
java.text.SimpleDateFormat simpleDateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
java.util.Date currentTime = new java.util.Date();
String time = simpleDateFormat.format(currentTime);
System.out.println(time);
int changeNum=0;
int notChangeNum=0;
try {
//查询全部的待同步商品id
String sql="select distinct item_id from sysmkt_store where flag =0 ";
ResultSet rs = dbo2.executeQuery(sql);
rs.last(); //移到最后一行
int rowCount = rs.getRow();//得到当前行号
rs.beforeFirst();
//System.out.println(rowCount);
for(int i = 1;i<rowCount+1;i++){//循环全部待同步的item_id
System.out.println(i);
if(rs.next()){
int m_item_id= rs.getInt(1);
String sql1="select item_id,item_store,sku_id,sku_store from sysmkt_store where item_id="+m_item_id+" ";
ResultSet rs1 = dbo2.executeQuery(sql1);
rs1.last(); //移到最后一行
int rowCount1 = rs1.getRow();//得到当前行号
rs1.beforeFirst();
int flag = 0;//初始化标识符0:可同步;1不可同步
for(int j = 1;j<rowCount1+1;j++){//循环该item_id下的全部sku_id
if(rs1.next()){
int m_sku_id= rs1.getInt(3);
int m_sku_store= rs1.getInt(4);
String sql2="select freez from sysitem_sku_store where sku_id="+m_sku_id+" ";
ResultSet rs2 = dbo.executeQuery(sql2);
while(rs2.next()){
int b_freez= rs2.getInt(1);
if(b_freez > m_sku_store){
//比较冻结库存与待修改库存大小
flag = 1;
}
}
rs2.close();
//dbo.closeConection();
}
}
if (flag==0){
rs1.beforeFirst();
for(int j = 1;j<rowCount1+1;j++){
if(rs1.next())
{
changeNum++;
int c_item_id= rs1.getInt(1);
int c_item_store= rs1.getInt(2);
int c_sku_id= rs1.getInt(3);
int c_sku_store= rs1.getInt(4);
String sql3 = "update sysitem_item_store set store="+c_item_store+" where item_id="+c_item_id+"";
int rs3=dbo.executeUpdate(sql3);
String sql4 = "update sysitem_sku_store set store= "+c_sku_store+" where sku_id= "+c_sku_id+"";
int rs4=dbo.executeUpdate(sql4);
String sql5 = "update sysmkt_store set flag=1,modified_time='"+time+"',reason='' where sku_id="+c_sku_id+"";
int rs5=dbo2.executeUpdate(sql5);
}
}
}
if (flag==1){
rs1.beforeFirst();
for(int j = 1;j<rowCount1+1;j++){
if(rs1.next())
{
notChangeNum++;
int n_sku_id= rs1.getInt(3);
String sql6 = "update sysmkt_store set flag=2,modified_time='"+time+"',reason='商品库存小于当前冻结库存' where sku_id="+n_sku_id+"";
int rs6=dbo2.executeUpdate(sql6);
}
}
}
rs1.close();
}
}
if (changeNum==0){
System.out.println(time+":当期无库存修改");
}
else{
System.out.println(time+":当期修改:"+changeNum+"条库存记录,未修改库存记录:"+notChangeNum+"共计"+rowCount+"条记录");
}
rs.close();
} catch (SQLException e) {
System.err.println(e.getMessage());
}
finally{
dbo.closeConection();
dbo2.closeConection();
}
isRunning = false;
context.log("指定任务执行结束");
}
} else {
context.log("上一次任务执行还未结束");
}
}
} 这个大致是从middle库读取全部的商品列表,然后去BBC库比对商品的冻结库存,大于冻结库存才可以修改库存。
这个逻辑大体上是没什么问题,就是不知道为啥,debug 的时候经常出现[toString() unavailable - no suspended threads]这个错误,跪求大神给予解答啊
没有报错,就是执行的效率很低,经常会卡住,然后我就去debug调试看看,一直按着F6单步调试的时候,就出现了[toString() unavailable - no suspended threads]
数据量大概是个1W+的样子。
不知道您说的打印有问题指的什么问题呢
不好意思刚才没看清,既然程序不报错只是执行慢,那说明你该优化代码逻辑。 至于你DEBUG的时候出错,这个有时候是正常的