时时从文本文件里面读取数据,存到数据库中。思路如下:(望请教更好思路)启动的时候从ServerTimer 里面建立一个Timer 每隔几秒运行一次 ReadTxt2DB .
ReadTxt2DB 负责从文本文件里面读取数据,并存放数据库。启动服务器的时候,文本文件里面有数据更新,此时会正常把数据更新到数据库中去。然后按说应该继续循环,一直去读文本文件,判断是否用写入数据库,,问题是:判断几次以后,,程度会挂起,,,如果把ReadTxt2DB 的读写操作去掉,程序会正常运行。不操作数据库操作没事儿,,也不挂起。。希望对线程更了解一些的高人赐教。。个人感觉不是代码造成的挂起,因为当文本文件里面没有更新的时候会去判断几次,,几次以后才挂起是不是在spring 环境下不应该这样配置timer呢?? 急。
代码如下: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();
}
}*/
}
}
}
ReadTxt2DB 负责从文本文件里面读取数据,并存放数据库。启动服务器的时候,文本文件里面有数据更新,此时会正常把数据更新到数据库中去。然后按说应该继续循环,一直去读文本文件,判断是否用写入数据库,,问题是:判断几次以后,,程度会挂起,,,如果把ReadTxt2DB 的读写操作去掉,程序会正常运行。不操作数据库操作没事儿,,也不挂起。。希望对线程更了解一些的高人赐教。。个人感觉不是代码造成的挂起,因为当文本文件里面没有更新的时候会去判断几次,,几次以后才挂起是不是在spring 环境下不应该这样配置timer呢?? 急。
代码如下: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();
}
}*/
}
}
}
解决方案 »
- 请问下log4j.properties加载机制是怎样的
- Could not find action or result,两天。求解决。
- EJB能将查询结果封装为MAP吗
- 附JAVA代码,急急急!SSH问题,No setter found for property 'tTreeDao' in
- 配置连接池出现一个问题:希望高手能给我个答案。。。。先谢了。。。。。
- hibernate3分页查询执行几次就不执行了
- 非常困惑的问题。在hibernate中的hibernate.cfg.xml文件放在哪?
- SSH整合错误 Could not instantiate bean class [org.hibernate.cfg.Configuration]
- 各位高人 请问怎么用struts配置sqlserver2000的驱动啊
- 关于JDBC存储和提取中文字符的问题
- SSH 很简单的问题 java.lang.RuntimeException 大侠们给看看
- 菜鸟求助 异常处理的小程序 奇怪的输出不理解啊 求解释。。。
不过说Spring跟这Timer有仇,我还是不太信。