时时从文本文件里面读取数据,存到数据库中。思路如下:(望请教更好思路)启动的时候从ServerTimer  里面建立一个Timer  每隔几秒运行一次 ReadTxt2DB .
ReadTxt2DB 负责从文本文件里面读取数据,并存放数据库。启动服务器的时候,文本文件里面有数据更新,此时会正常把数据更新到数据库中去。然后按说应该继续循环,一直去读文本文件,判断是否用写入数据库,,问题是:判断几次以后,,程度会挂起,,,如果把ReadTxt2DB  的读写操作去掉,程序会正常运行。不操作数据库操作没事儿,,也不挂起。。希望对线程更了解一些的高人赐教。。个人感觉不是代码造成的挂起,因为当文本文件里面没有更新的时候会去判断几次,,几次以后才挂起代码如下:public class ServerTimer implements ServletContextListener   
{  
public static Timer timer = null;   

public void contextInitialized(ServletContextEvent event) {   
    timer = new Timer(true);   
    timer.scheduleAtFixedRate(new MyTask(), new Date(), 10000);   //120000  //30000
}  

public void contextDestroyed(ServletContextEvent event) {   
    timer.cancel();   
}   

}   public class MyTask extends TimerTask{ @Override
public void run() {
try {
 new ReadTxt2DB().init();
} catch (ServletException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}}
public class ReadTxt2DB{

public static ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
public static XiangmuobjectDAO xmodao = (XiangmuobjectDAO)ctx.getBean("XiangmuobjectDAO");
public static CellobjectDAO cbodao = (CellobjectDAO)ctx.getBean("CellobjectDAO");
public static CibprojectDAO cpodao = (CibprojectDAO)ctx.getBean("CibprojectDAO");
public  void ReadDataDBWrite(Date lastdate,Timestamp lastdatatime, Cibproject cp){
System.out.println(lastdatatime);
System.out.println("ReadDataDBWrite");
int pid = cp.getPid(); 
java.sql.Date currentdatetime = new java.sql.Date(System.currentTimeMillis());
String tPname = cp.getPname().trim();
java.sql.Date lastdatetmp = lastdate;
java.util.Date lastdatetimetmp = lastdatatime;
String datefolder =  "D:\\Data\\"  +  tPname +  "\\"  +  lastdatetmp  +  ".txt";
LineNumberReader lnr;
GregorianCalendar cal;


//while(lastdatetimetmp.before(currentdatetime)){
while((currentdatetime.getTime()-lastdatetimetmp.getTime())/1000>0){
int isexit =0;
String s;
try {
datefolder =  "D:\\Data\\"  +  tPname +  "\\"  +  lastdatetmp  +  ".txt";
lnr = new LineNumberReader(new FileReader(datefolder));
System.out.println("文本数据存放路径:"+datefolder); lnr.readLine();
while((s = lnr.readLine())!= null){
String[] datas = s.split(",");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

java.util.Date linetime =  sdf.parse(datas[0]);
// xmodao.saveXiangMuData(pid, datas);
if(currentdatetime.getTime()-linetime.getTime()>0){
System.out.println("line"+lnr.getLineNumber()+" :    "+s);
xmodao.saveXiangMuData(pid, datas);
lastdatetimetmp = linetime;
}
  System.out.println(lnr.getLineNumber()+"****************************************************************");
}
//组装地址
cal = new GregorianCalendar();
cal.setTime(lastdatetmp);
cal.add(GregorianCalendar.DATE, 1);
lastdatetmp = new java.sql.Date(cal.getTime().getTime());
Date c1 = new java.sql.Date(cal.getTime().getTime());
if(c1.before(new java.sql.Date(System.currentTimeMillis()))){
//重新赋值最后日期和最后时间
lastdatetmp = c1;
}else{
break;
}


lnr.close();
} catch (FileNotFoundException e) {
System.out.println("注意:   项目"+pid +"     " +"没有些日期文本数据:"+lastdatetmp);
cal = new GregorianCalendar();
cal.setTime(lastdatetmp);
cal.add(GregorianCalendar.DATE, 1);
Date c1 = new java.sql.Date(cal.getTime().getTime());
if(c1.before(new java.sql.Date(System.currentTimeMillis()))){
//重新赋值最后日期和最后时间
lastdatetmp = c1;
lastdatetimetmp = c1;
}else{
break;
}

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

if(isexit>0){

}

}
}

public void init() throws ServletException{

System.out.println("init*************************");
List list = cpodao.findAll();
for(int i=0;i<list.size();i++){
Cibproject cp = (Cibproject)list.get(i);
if(cp!=null){
System.out.println("开始更新项目"+cp.getPid()+"数据");
System.out.println("====================================");
Timestamp tm = xmodao.getLastResultDNT(cp.getPid());
System.out.println("数据库中最后一条记录的时间:"+tm);
if(tm!=null){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String d = sdf.format(tm);
java.sql.Date ss;
try {
ss = new java.sql.Date(sdf.parse(d).getTime());
java.sql.Date lastdate = ss;
ReadDataDBWrite(lastdate,tm,(Cibproject)list.get(i));
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//java.sql.Date lastdate = new Date(tm.getTime());


}else{
System.out.println("数据库为空,此次为第一次存储数据.设置从'2011-03-10' 日之后开始更新!");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

try {
java.util.Date dd = sdf.parse("2011-03-10 22:32:43");
java.sql.Date lastdate = new Date(dd.getTime());
tm = new Timestamp(dd.getTime());
ReadDataDBWrite(lastdate,tm,(Cibproject)list.get(i));
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}/***/
}
}
}

}如果把下面这些操作数据库的代码注释起来,会按逻辑正常运行public void init() throws ServletException{

System.out.println("init*************************");
List list = cpodao.findAll();
for(int i=0;i<list.size();i++){
Cibproject cp = (Cibproject)list.get(i);
if(cp!=null){
System.out.println("开始更新项目"+cp.getPid()+"数据");
System.out.println("====================================");
/** 如果把下面这些操作数据库的代码注释起来,会按逻辑正常运行
Timestamp tm = xmodao.getLastResultDNT(cp.getPid());
System.out.println("数据库中最后一条记录的时间:"+tm);
if(tm!=null){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String d = sdf.format(tm);
java.sql.Date ss;
try {
ss = new java.sql.Date(sdf.parse(d).getTime());
java.sql.Date lastdate = ss;
ReadDataDBWrite(lastdate,tm,(Cibproject)list.get(i));
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//java.sql.Date lastdate = new Date(tm.getTime());


}else{
System.out.println("数据库为空,此次为第一次存储数据.设置从'2011-03-10' 日之后开始更新!");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

try {
java.util.Date dd = sdf.parse("2011-03-10 22:32:43");
java.sql.Date lastdate = new Date(dd.getTime());
tm = new Timestamp(dd.getTime());
ReadDataDBWrite(lastdate,tm,(Cibproject)list.get(i));
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}*/
}
}
}

解决方案 »

  1.   

    查看下与数据库连接数最大是多少,DAO使用之后有没有释放掉
    请求资源数达到最大的时候就会挂起
      

  2.   

    你的init方法太重量级,而周期又很短,很有可能上个周期还没操作完,下个周期又开始了,有可能因为数据库操作造成锁,先把数据库操作去掉试试
      

  3.   

    只是挂起,没有报异常?做Log看看。建议先将dao相关的代码注释掉,这样可以排查数据库访问有没有问题。
      

  4.   


    1。如何查看数据库连接量大数呢?我用的是mysql 
    2。是在spring环境下的,DAO 是不是不处自己释放呢?  这个我去看一下。
    ------------------------------------------------------------
      

  5.   

    哦,DAO  是自己创建的,,public ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        public XiangmuobjectDAO xmodao = (XiangmuobjectDAO)ctx.getBean("XiangmuobjectDAO");
        public CellobjectDAO cbodao = (CellobjectDAO)ctx.getBean("CellobjectDAO");
        public CibprojectDAO cpodao = (CibprojectDAO)ctx.getBean("CibprojectDAO");DAO  不创建成 staitc 的时候报过    connect   too  many    详细忘记了,,大概是这么一个错误。。
    如果不建成 staitc 每次创建新的对象的时候报这种错,,如果用staitc  的时候 ,是不是像  KingOf007
    说的,,init 比较重量级,,后面的线程等待前面线程释放 dao 对象 ,notify  前一个线程的时候 报类似InterruptedException  这样的错误呢??可能报过这个错,被try掉了,没有显示出来。。
      

  6.   

    dao是如何管理的,有没有使用事务,可以用transactionManager试一下,
    手动open,close很容易出错,特别是多线程和出现异常的时候
    另外不建议把dao弄成static的