时时从文本文件里面读取数据,存到数据库中。思路如下:(望请教更好思路)启动的时候从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();
}
}*/
}
}
}
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();
}
}*/
}
}
}
解决方案 »
- 怎么用java实现文本的关键字提取?
- 找不到集合的get方法
- applet大图片显示问题
- JSP页面是如何被执行的?JSP执行效率比Servlet低吗?
- 关于多线程的简单问题!!
- JTable从数据表中得到数据时出错,请大家帮助。急。
- 菜鸟想问一个小的问题 问题提示 note:testclass.java uses or voerrides a deprecated API
- java如何实现跳出文件保存对话框
- 为什么JTextPane与JEditorPane显示网页都是一些乱七八糟的东西,难道就没有能完整显示网页的吗?
- 请教一个简单问题
- 怎么将字符串型的数学表达式计算出结果?”
- 如何使jap代码更安全
请求资源数达到最大的时候就会挂起
1。如何查看数据库连接量大数呢?我用的是mysql
2。是在spring环境下的,DAO 是不是不处自己释放呢? 这个我去看一下。
------------------------------------------------------------
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掉了,没有显示出来。。
手动open,close很容易出错,特别是多线程和出现异常的时候
另外不建议把dao弄成static的