//schema.sql
connect to trdata;
create table trentry (id integer not null , name char(25), descr varchar(128), views integer with default 0, constraint p_trentry primary key (id));
//propsamples.java
package train;
import java.util.*;
import java.sql.*;
public class propsamples {
public static string getstring(int size, random rand) {
stringbuffer strbuff = new stringbuffer();
for (int i = 0; i < size; i++) {
char b = (char) (rand.nextint(25) + 65);
strbuff.append(b);
}
return strbuff.tostring();
}
public void process() throws sqlexception {
string sqlstring = "insert into trentry values(?,?,?,?)";
connection connection = util.getdbconnection();
preparedstatement stmt = connection.preparestatement(sqlstring);
random rand = new random();
for (int i = 1; i <= 250000; i++) {
stmt.clearparameters();
stmt.setint(1, i);
stmt.setstring(2, getstring(25, rand));
stmt.setstring(3, getstring(128, rand));
stmt.setint(4, 0);
stmt.execute();
if (i%1000 == 0) {
connection.commit();
system.out.println(i + " rows committed");
}
}
}
public static void main(string[] args) throws sqlexception{
propsamples propsamples = new propsamples();
propsamples.process();
}
}
// classicservlet.java
package train;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.sql.*;
public class classicservlet
extends httpservlet {
int mentrylength = 250000;
random mrand;
public void init() throws servletexception {
mrand = new random(system.currenttimemillis());
}
public void doget(httpservletrequest request, httpservletresponse response) throws
servletexception, ioexception {
printwriter out = response.getwriter();
statement stmt = null;
connection connection = null;
string name = "";
string descr = "";
int views = 0;
int id = 0;
boolean iserror = false;
synchronized (mrand) {
id = mrand.nextint(mentrylength);
}
try {
connection = util.getdbconnection();
stmt = connection.createstatement();
string sqlstr = "select id, name, descr, views from trentry where id =" + id;
resultset rs = stmt.executequery(sqlstr);
while (rs.next()) { //retrieves data from from db
name = rs.getstring("name");
descr = rs.getstring("descr");
id = rs.getint("id");
views = rs.getint("views");
}
statement stmtviews = connection.createstatement();
string sqlviewstr = "update trentry set views = views+1 where id =" + id;
stmtviews.executeupdate(sqlviewstr); //updates number of the page views
}
catch (sqlexception ex) {iserror = true;}
finally {
try {
if (stmt != null) {
stmt.close();
}
if (connection != null) {
connection.commit();
connection.close();
}
}
catch (sqlexception ex1) {iserror = true;}
}
if (iserror) {
out.println("<html>system error</html>");
}
else { //delivers html page to browser
out.println("<html>");
out.println("<p>id: " + id + "</p>");
out.println("<p>name: " + name + "</p>");
out.println("<p>description: " + descr + "</p>");
out.println("<p>views: " + views + "</p>");
out.println("</body></html>");
}
}
}
statement.addbatch(); //load the first passenger
statement.addbatch(); // load the second passenger
…
statement.executebatch(); //train is departing
//trainservlet.java
package train;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class trainservlet extends httpservlet {
int mentrylength=250000;
dispatcher mdispatcher;
random mrand;
public void init() throws servletexception {
mrand = new random(system.currenttimemillis());
mdispatcher = new dispatcher();
thread ht = new thread(mdispatcher); //instantiate and execute in the separate thread.
ht.start();
}
public void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception {
int id=0;
synchronized(mrand){
id=mrand.nextint(mentrylength);
}
job job = new job(string.valueof(id)); //each concurrent request creates job instance.
job.mjobthread = thread.currentthread(); //job should know the thread of the request.
printwriter out = response.getwriter(); //job should know the output stream of the browser.
job.mout = out;
mdispatcher.addjob(job); //job is sent to the dispatcher.
//dispatcher is a container for all concurrent jobs.
try {
thread.sleep(100000); //let's wait until database interaction is finished.
system.out.println("error: request is timed out"); //too bad. 100 seconds was not enough.
}
catch (interruptedexception ex2) {
//success! members of the job instances are populated.
}
job.marshall(); // let's display the page in the browser.
}
}
//job.java
package train;
import java.io.*;
public class job {
string mname;
string mdescr;
int mviews;
string mid;
printwriter mout;
thread mjobthread;
boolean mhasfailed = false;
//sorry, no getters and setters to save space
public job(string id) {
mid = id;
}
public void marshall(){ // displays html page
mout.println("<html><body>");
if(mhasfailed){
mout.println("system error");
}else{
mout.println("<p>id: "+mid+"</p>");
mout.println("<p>name: "+mname+"</p>");
mout.println("<p>description: "+mdescr+"</p>");
mout.println("<p>views: "+mviews+"</p>");
}
mout.println("</body></html>");
}
}
//dispatcher.java
package train;
import java.util.*;
public class dispatcher
implements runnable {
private list mcurrentjobbatch = new arraylist(); //batch container
private int mjobbatchmaxsize = 5; //maximum number of the jobs in the batch
private int mintervaltime = 50; //maximum time to wait before batch execution
public synchronized void addjob(job job) {
mcurrentjobbatch.add(job);
if (mcurrentjobbatch.size() == mjobbatchmaxsize) {
processjobbatch(); //if batch is full, execute
}
}
private synchronized void processjobbatch() {
if (mcurrentjobbatch.size() == 0) { return; }
worker worker = new worker(mcurrentjobbatch);
thread ht = new thread(worker);
ht.start();
mcurrentjobbatch = new arraylist();
}
public void run() {
try {
while (true) {
thread.sleep(mintervaltime);
processjobbatch(); // each mintervaltime milliseconds execute batch
}
}
catch (interruptedexception ex) { }
}
}
//worker.java
package train;
import java.util.*;
import java.sql.*;
public class worker
implements runnable {
list mjobs;
map mjobmap; //helper member for mapping the jobs
protected worker(list jobs) {
mjobs = jobs;
mjobmap = new hashmap();
}
private void process() {
boolean iserror = false;
stringbuffer sqlbuff = new stringbuffer(
"select id,name ,descr,views from trentry where id in ");
stringbuffer whereclause = createwhereclause(); //
sqlbuff.append(whereclause);
/* now sql statement is fully formed and looks like:
select id,name ,descr,views from trentry where id in (3343,22222,5555).
this will allow us to fetch several user requests in one shot */
connection connection = null;
statement stmt = null;
try {
connection = util.getdbconnection();
stmt = connection.createstatement();
resultset rs = stmt.executequery(sqlbuff.tostring());
system.out.println(sqlbuff.tostring());
map result = new hashmap();
while (rs.next()) {
int id = rs.getint("id");
string name = rs.getstring("name");
string descr = rs.getstring("descr");
int views = rs.getint("views");
job job = (job) mjobmap.get(string.valueof(id));
//populate instance of the job with data retrieved from database
job.mname = name;
job.mdescr = descr;
job.mviews = views;
}
string sqlviewstr = "update trentry set views = views+1 where id in " +
whereclause;
// the same trick for update statement
stmt.executeupdate(sqlviewstr);
}
catch (sqlexception ex) {
iserror = true;
}
finally {
try {
if (stmt != null) {
stmt.close();
}
if (connection != null) {
if (iserror) {
connection.rollback();
}
else {
connection.commit();
}
connection.close();
}
}
catch (sqlexception ex1) { iserror = true; }
}
finishjobs(iserror);
return;
}
private stringbuffer createwhereclause() {
stringbuffer clause = new stringbuffer("(");
for (int i = 0; i < mjobs.size(); i++) {
job job = (job) mjobs.get(i);
string id = job.mid;
if (i != 0) {
clause.append(",");
}
clause.append(id);
mjobmap.put(id, job);
}
clause.append(")");
return clause;
}
private void finishjobs(boolean iserror) {
for (int i = 0; i < mjobs.size(); i++) {
job job = (job) mjobs.get(i);
if (iserror) {
job.mhasfailed=true; //rudimentary error handling
}
job.mjobthread.interrupt();
/* wake up the trainservlet to deliver the page to the browser */
}
}
public void run() {
process();
}
}
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器