如何在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("……");
- 如何在struts2的action返回结果之后再来进行费时的数据库操作呢?
- Struts2中Action的返回结果类型
- Android数据库查询操作的一次粗心费时
- 如何得到线程执行完之后返回的结果
- HttpURLConnection 请求struts2的action。如何拿到结果
- Mybatis对有可能返回empty set的数据库查询结果进行操作
- SSH:Struts2的Action如何返回JSON格式的数据?
- struts2返回结果的类型
- struts2如何实现弹出action返回的错误信息
- struts2如何实现弹出action返回的错误信息
- struts2 文件上传时,某次上传失败之后的所有上传都返回input,不跳到action
- struts2 文件上传时,某次上传失败之后的所有上传都返回input,不跳到action
- ajax 返回封装之后的结果
- struts2如何配置两个不同的action进行交互
- 如何对存储过程返回的结果进行条件查询
- 如何对存储过程返回的结果进行条件查询
- 如何在Struts2的Action中操作servletAPI(内置对象)
- Struts2零配置之Action链和返回结果集的定向
- Area - POJ 1265 Pick定理
- 黑马程序员——基础学习(十二)异常(Throwable)类、文件(File)类及递归
- IOS模拟器点击fieldText 不弹出软键盘
- C语言学习(第一天)
- Gifview的使用
- 如何在struts2的action返回结果之后再来进行费时的数据库操作呢?
- Android初学习 - 明暗度,窗体透明等的设置技巧
- poj 3414 Pots(BFS)(简单题)
- Monkey log异常分析说明
- CodeForces 546A Soldier and Bananas
- The sizeof Operator
- Oracle库Delete删除千万以上普通堆表数据的方法
- opencv中各种矩阵乘的区别
- display属性