各位大家好,今天我有一个问题想请教大家,请各位不吝赐教。
我现在做的一个项目当中有一个这样的要求,就是对数据库的访问使用多线程序来完成。
比方说,我要完成十个查询任务
“Select * from table_1”
“Select * from table_2”
“Select * from table_3”
“Select * from table_4”
“Select * from table_5”
“Select * from table_6”
“Select * from table_7”
“Select * from table_8”
“Select * from table_9”
“Select * from table_10”
以前我们的做法是等待当前执行的查询操作完成,得到返回结果以后,再去执行下一个。现在的要求是将这十个查询语句发给数据访问封装类(DAO之类)后,启用多线程执行,等所有线程执行完后,再去获得记录集。我的初步想法和做法如下:
采用2个类和一个接口
/**
* 这是我测试用的数据访问封装类
*/
class DataExec {
/* 返回List类型纪录集
public List getResult(String sql)
/* 这是为以后的更新用的 */
public void commit()
public void rollback()
}
/**
* 提供外界访问数据结果的接口
*/
interface ThreadResult {
List getResultList()
}/**
* 进行数据访问的线程类
*/
class ThreadExecute implements Runnable, ThreadResult {
DataExec de = new DataExec();
ThreadExecute(String sql, ThreadGroup tg)
run 方法用来调用 DataExec 访问数据库得到查询结果,并判断是否有数据库异常发生,如果发生异常,就中断线程组 tg(十个查询线程都属于这个线程组)
void run() { }
返回得到的查询结果
List getResultList()
}/**
* 这是提供外界进行多线程访问的封装类
*/
class ThreadProxy {
ThreadGroup tg = new ThreadGroup();
priority参数是线程运行的优先级。外部提供一个查询语句,就启动一个线程查询,
并返回一个 ThreadResult 接口供外部得到查询结果。
public ThreadResult setSql(String sql, int priority) {
ThreadExecute te = new ThreadExecute(sql, execType, sqlGroup);
ThreadResult tr = te;
t = new Thread(tg, te);
return tr;
} 这个方法用来枚举此次数据库访问的线程,等待他们运行结束。提供外部调用。
public void waitExec() {
Thread t[] = new Thread[tg.activeCount()];
tg.enumerate(t);
try {
for(int i=0; i<t.length; i++) {
t[i].join();
}
} catch (InterruptedException ie) {}
}
}/*
* 测试 Main 类
*/
class Test {
public static void main(String args[]) {
ThreadProxy tp = new ThreadProxy();
ThreadResult []result = new ThreadResult[10];
for(int i=1; i<=10; i++) {
result[i -1] = tp.setSql("select * from table_” + i);
}
tp.waitExec();
System.out.println(result[3].getResultList());
System.out.println(result[9].getResultList());
}
}我现在的主要问题是 class ThreadProxy 的setSql 方法提供了线程的封装访问,但是这个方法马上就返回了,无法提供对线程运行的实时监控,那么线程运行当中产生的 中断异常无法捕捉。我要捕捉中断异常的原因是要当一个查询出现异常后,将已执行完成的线程的返回值置为空(数据量很少的情况下,有的线程执行快,没来得及中断它,他已经执行完了),或为以后增加数据更新时,发生异常就回滚操作。
谢谢,请各位看一看。
我现在做的一个项目当中有一个这样的要求,就是对数据库的访问使用多线程序来完成。
比方说,我要完成十个查询任务
“Select * from table_1”
“Select * from table_2”
“Select * from table_3”
“Select * from table_4”
“Select * from table_5”
“Select * from table_6”
“Select * from table_7”
“Select * from table_8”
“Select * from table_9”
“Select * from table_10”
以前我们的做法是等待当前执行的查询操作完成,得到返回结果以后,再去执行下一个。现在的要求是将这十个查询语句发给数据访问封装类(DAO之类)后,启用多线程执行,等所有线程执行完后,再去获得记录集。我的初步想法和做法如下:
采用2个类和一个接口
/**
* 这是我测试用的数据访问封装类
*/
class DataExec {
/* 返回List类型纪录集
public List getResult(String sql)
/* 这是为以后的更新用的 */
public void commit()
public void rollback()
}
/**
* 提供外界访问数据结果的接口
*/
interface ThreadResult {
List getResultList()
}/**
* 进行数据访问的线程类
*/
class ThreadExecute implements Runnable, ThreadResult {
DataExec de = new DataExec();
ThreadExecute(String sql, ThreadGroup tg)
run 方法用来调用 DataExec 访问数据库得到查询结果,并判断是否有数据库异常发生,如果发生异常,就中断线程组 tg(十个查询线程都属于这个线程组)
void run() { }
返回得到的查询结果
List getResultList()
}/**
* 这是提供外界进行多线程访问的封装类
*/
class ThreadProxy {
ThreadGroup tg = new ThreadGroup();
priority参数是线程运行的优先级。外部提供一个查询语句,就启动一个线程查询,
并返回一个 ThreadResult 接口供外部得到查询结果。
public ThreadResult setSql(String sql, int priority) {
ThreadExecute te = new ThreadExecute(sql, execType, sqlGroup);
ThreadResult tr = te;
t = new Thread(tg, te);
return tr;
} 这个方法用来枚举此次数据库访问的线程,等待他们运行结束。提供外部调用。
public void waitExec() {
Thread t[] = new Thread[tg.activeCount()];
tg.enumerate(t);
try {
for(int i=0; i<t.length; i++) {
t[i].join();
}
} catch (InterruptedException ie) {}
}
}/*
* 测试 Main 类
*/
class Test {
public static void main(String args[]) {
ThreadProxy tp = new ThreadProxy();
ThreadResult []result = new ThreadResult[10];
for(int i=1; i<=10; i++) {
result[i -1] = tp.setSql("select * from table_” + i);
}
tp.waitExec();
System.out.println(result[3].getResultList());
System.out.println(result[9].getResultList());
}
}我现在的主要问题是 class ThreadProxy 的setSql 方法提供了线程的封装访问,但是这个方法马上就返回了,无法提供对线程运行的实时监控,那么线程运行当中产生的 中断异常无法捕捉。我要捕捉中断异常的原因是要当一个查询出现异常后,将已执行完成的线程的返回值置为空(数据量很少的情况下,有的线程执行快,没来得及中断它,他已经执行完了),或为以后增加数据更新时,发生异常就回滚操作。
谢谢,请各位看一看。
解决方案 »
- applicationContext.xml中的一个小问题的问题
- 急!高手指点-IE8如何解决Session共享?
- 求高手将C#代码转换为Java代码,关于获取网页信息的代码,一些C#中的类不知道如何对应Java类
- 正则边界匹配的问题
- 过滤器问题。
- 从网站上下载了jsp整站源码,请问如何调试啊?
- 请问Excel已成生的图表如何让他显示到jsp中?
- jsp用jdbc连接数据库的问题
- JAVA如何返回前一天,今天为Today="20090203",前一天为20090202
- jsp原先有的优势就是跨平台,但是asp.net有了mono!
- 请问如何在action中取得WEB.XML中定义的参数,谢谢
- 300分!!EXCEL转PDF.不够的话开新帖给分。
如果一个WebApp系统在Web服务(如Tomcat)加载的时候就使用Servlet生成一个操作DB的类(单例实现),那么在应用过程中,如果两个IP地址的用户同时进行DB操作(首先得到DB操作类),那么就是有先有后了?
如果在这个单例实现类中加入线程的话,是不是说两个或多个IP同时操作DB的时候就可以并行?
如果按照一楼的这种做法,加上我的这种假设,是不是等于无论多少个用户访问WebApp的时候,都是在一个线程控制,是不是会很浪费系统资源?
多个用户访问WebApp的时候,Servlet 它是多线程的啊,是不是耗系统资源我也搞不太清楚.
期待高手解答