如何在struts2的action返回结果之后再来进行费时的数据库操作呢?

action里边有些操作执行要花很长时间,这样就会影响服务器与前台的交互速度,所以问题就来了,能不能在action返回一个json结果之后再来进行这些耗时的操作呢?


最初的时候,我是这样想的:

struts2的运行流程是:

客户端发送请求,然后服务器中的某个action的方法被调用,然后返回一个数据给客户端,然后服务器端结束。

因为action一般写成如下,所以我便特别困惑,给出result之后要么是跳到一个jsp页面,要么直接就是跳到一个json数据,还怎么进行操作啊!!头疼呀。

<action name="test" class="action.testAction">
    <result name = "success">welcome.jsp</result>

</action>

<action name="testCircles" class="action.UploadAction">
   <result type = "json">
    <param name="contentType">
                    text/html
                </param>
                <param name="root">
                    map
                </param>
</action>

然后百度之,无果~~~~这个时候我就想到了酷壳网的弹窗作环保的程序员,从不用百度开始!再见用谷歌挺好的诶,在开源中国社区找到了个思路,接下来会提到。

还能怎么办呢?

都说SSH,我只是在用Struts,好像还没用过Spring诶,于是我开始查看Spring的资料,

嘿,里边还真有个好像似乎有用的idea------后置通知。

按照它的思路,我可以将我的action的execute设置为目标对象,在execute处理完之后,

便可以自动地进行后置通知类中的操作啦,我只需要把数据库操作放在后置通知类里边不就好了嘛!

So,问题来啦,action的类对象和后置通知类的对象创建都是由Spring自动完成的,我不需要操作,那action得到的数据如何传给后置通知类呢?疑问

这个时候我想到可以用一个类专门来存数据,里边的变量都是静态类型,哈哈,这样不就解决了嘛!

说到这里,就必须加个可是了委屈。正所谓好事多磨啊!

我把action的execute方法和后置通知的after方法连起来了,运行的时候execute运行结束,after方法也成功接力,但是呢,我action的返回结果,怎么变成null了啊!!发火我明明设置返回json,明明加了map.put(key,value),可现在什么都没有了!!!


此路不通呀!!!

谷歌为我提供了开源中国的一个链接如下

http://www.oschina.net/question/119742_77918

里边提到线程池,疑问好高端的样子,是什么东西啊?这个时候多线程出现在了我的脑子里,对哦,可以用多线程嘛,只需要再execute里边启动一个线程专门做数据库操作不就好啦!

哈哈哈哈,问题成功解决,多线程果然厉害!!

整个流程用到的文件如下:

首先是数据库存取的类Circles,之后是它与数据库的映射文件以及数据库的配置文件。

接着是数据库操作类,实现Circles类的存取与更新。

最后则是线程类。

Circles.java存取的数据库对象

<span style="font-size:14px;">package com.test.bean;
import java.util.List;
import java.util.ArrayList;

public class Circles {
	private String imageName;
	private List<String> circles = new ArrayList<String>();
	public String toString(){
		StringBuffer strBuf = new StringBuffer();
		strBuf.append(" imageUrl= " + imageName  + "]\n");
		for (int i = 0; i < circles.size(); i++){
			strBuf.append("The "+ i +" th circle is : " + circles.get(i) + "\n");
		}
		return strBuf.toString();
	}
	public List<String> getCircles() {
		return circles;
	}
	public void setCircles(List<String> circles) {
		this.circles = circles;
	}
	public String getImageName() {
		return imageName;
	}
	public void setImageName(String imageName) {
		this.imageName = imageName;
	}
}</span>

对象关系映射Circles.hbm.xml

<pre name="code" class="html"><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.yjj">
	<class name = "com.test.bean.Circles" table = "circleOfimage">
		<id name = "imageName" column = "imageName" type = "string">
			<generator class = "assigned"></generator>
		</id>

		<list name = "circles" table = "myCircles">
			<key>
				<column name = "imageName"></column>
			</key>
			<list-index>
				<column name="list_order"></column>
			</list-index>
			<element type = "java.lang.String">
				<column name="circle_info"></column>
			</element>
		</list>
	</class>
</hibernate-mapping>

 

数据库配置文件hibernate.cfg.xml

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>
    <session-factory>          
        <property name="connection.url">jdbc:mysql://localhost:3306/mysql</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>
		<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="show_sql">false</property>
        <property name="format_sql">true</property>
		<property name="hbm2ddl.auto">update</property>
		<mapping resource = "com/test/bean/Circles.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

数据库存取事务类CircleDAOImpl.java

package com.test.dao.impl;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.test.bean.Circles;
import com.test.dao.CirclesDAO;
public class CirclesDAOImpl implements CirclesDAO {

	public void save(Circles circles) {
		Configuration cfg = new Configuration();
		SessionFactory sessionFactory = cfg.configure().buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction ts = session.beginTransaction();
                session.save(circles);
		ts.commit();
                session.close();
	}
	@SuppressWarnings("unchecked")
	public Circles findAllCircles(String imageName) {
		// TODO Auto-generated method stub
		Configuration cfg = new Configuration();
		SessionFactory sessionFactory = cfg.configure().buildSessionFactory();
		Session session = sessionFactory.openSession();
		System.out.println("from Circles where imageName=" + "'" + imageName + "'");
		List list = session.createQuery("from Circles where imageName=" + "'" + imageName + "'").list();
		Circles circlesOfImage = null;
		if (list.size() > 0){
			circlesOfImage = (Circles)list.get(0);
			System.out.println(circlesOfImage.toString());
		}
		System.out.println("over"+list.size());
                session.close();
                return circlesOfImage;
	}
	public void update(Circles circles) {
		Configuration cfg = new Configuration();
		SessionFactory sessionFactory = cfg.configure().buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction ts = session.beginTransaction();
		Circles updatedCircles = (Circles)session.get(Circles.class, circles.getImageName());
		updatedCircles.setCircles(circles.getCircles());
		session.update(updatedCircles);
		ts.commit();
		session.close();
	}
}

线程类

package com.test.action;

import com.test.bean.Circles;
import com.test.dao.impl.CirclesDAOImpl;

public class SaveCirclesThread implements Runnable {
	
	private CirclesDAOImpl circleDAO;
	private Circles circle;
	public SaveCirclesThread(Circles circle){
		circleDAO = new CirclesDAOImpl();
		this.circle = circle;
	}

	public Circles getCircle() {
		return circle;
	}
	public void setCircle(Circles circle) {
		this.circle = circle;
	}
	public void run() {
		long currentTime1 = System.currentTimeMillis();
        System.out.println("start saving……");
        circleDAO.save(circle);
        Data.setData(circle.getImageName(), circle.getCircles());
        long currentTime2 = System.currentTimeMillis();
        System.out.println("end saving……cost time " + (currentTime2 - currentTime1) + "ms");
    }
}
最后在action中创建线程并启动就好啦
System.out.println("开始线程:存入数据库……");
        Thread t = new Thread(new SaveCirclesThread(circle));
        t.start();
        System.out.println("……");




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值