解决方案 »
- Spring3.1整合Hibnerte4.1无法获取session错误,求指教!
- tomcat运行一会项目就会死掉
- 急需面试sql语句的试题
- Java学习
- Hibernate 3.2 Hello world的问题(Could not execute JDBC batch update)
- hibernate的criteria查询的问题
- jframe窗体最大化以后为什么里面的控件大小不变
- 请问hibernate中怎么获取存储过程返回的值?
- 想做一個WEB方式的OUTLOOK,請問JAVAMAIL怎樣創建和操作本地的收件箱,發件箱????
- 学习EJB,郁闷中...
- 客户端和服务器数据传输安全问题
- extjs 导出excel问题
2.开辟一个缓冲内存(队列的形式),足够大,有一个连接就往里面写。每个小时写完后清空。
使用缓冲流,临时文件等等来提高写的性能
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.atomic.AtomicInteger;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.log4j.Logger;import com.iresearch.appstore.util.WriterFileUtil;/**
* Servlet implementation class WriteServlet
*/
public class WriteServlet extends HttpServlet {
protected final Logger logger = Logger.getLogger(this.getClass());
private final static long serialVersionUID = 1L;
private volatile boolean isRunning = false;
AtomicInteger count = new AtomicInteger();
DateFormat format = new SimpleDateFormat("yyyyMMdd_HH");
BlockingQueue<String> queue = new LinkedBlockingQueue<String>(100000);
/**
* @see HttpServlet#HttpServlet()
*/
public WriteServlet() {
super();
} /**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
logger.info( request.getParameter("jsonstr") + count.incrementAndGet()+ "\r\n" );
/*if(queue.offer(request.getParameter("jsonstr") + count.incrementAndGet()+ "\r\n")){
//System.out.println("put data to queue sucess..");
}else{
System.out.println("put data to queue failed..");
}
if(!isRunning){
Thread writeFile = new Thread(new WriteFile());
writeFile.start();
} */
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
class WriteFile implements Runnable {
@Override
public void run() {
isRunning = true;
try {
while (isRunning) {
/*
* 2秒内取不到就返回null,也可以用take方法,取不到数据会阻塞,isRunning可以不用
*/
/*String data = queue.poll(2, TimeUnit.SECONDS);
if (null != data) {
System.out.println("正在处理第" + data + "次请求!");
Thread.sleep(5000);
} else {
System.out.println("队列里没数据!");
// 超过2s还没数据,自动退出线程。
isRunning = false;
}*/
//get data from queue up to 10000
List<String> jsonList = new ArrayList<String>();
Integer jsonNum = queue.drainTo(jsonList, 1000);
//Integer jsonNum = queue.drainTo(jsonList);
System.out.println("获取:" + jsonNum + " 条数据");
if(null!=jsonNum && jsonNum>0){
WriterFileUtil.write(jsonList, format.format(new Date()));
System.out.println("写入文件成功..");
Thread.sleep(5 * 1000);
} else {
System.out.println("队列里没数据!");
// 超过2s还没数据,自动退出线程。
isRunning = false;
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}}
写文件类import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.List;public class WriterFileUtil {
private final static String DIR_NAME = "f:/test/";
private final static String FILE_SUFFIX = ".txt";
private static FileOutputStream fos = null;
private static FileChannel fc =null;
private static ByteBuffer bf = null;
public static void write(List<String>jsonList, String timestr) {
StringBuffer buffer = new StringBuffer();
for(String jsonstr : jsonList){
buffer.append(jsonstr);
}
try {
fos = new FileOutputStream(DIR_NAME + timestr + FILE_SUFFIX, true);
fc = fos.getChannel();
bf = ByteBuffer.allocate(1024*10000);
bf.put( (buffer.toString()).getBytes() ); /*System.out.println((buffer.toString()).getBytes().length);
System.out.println(bf.position());
System.out.println(bf.limit());*/
bf.flip();
fc.write(bf);
fc.close();
fos.close(); } catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}