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

来源:互联网 发布:广联达软件配置要求 编辑:程序博客网 时间:2024/05/16 18:16

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 stubConfiguration 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
原创粉丝点击