您的位置:首页 > 编程语言 > Java开发

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

2015-07-16 21:18 627 查看
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("……");




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: