首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

今天去面试,遇到一个很难的java题目,请教:该怎么回答?题目内容如下

2013-12-16 
今天去面试,遇到一个很难的java题目,请问:该如何回答?题目内容如下:在一个java web工程中,有一个类,需要频

今天去面试,遇到一个很难的java题目,请问:该如何回答?题目内容如下:
在一个java web工程中,有一个类,需要频繁的实例化该类进而使用它,使用完后要频繁的销毁它来释放系统资源,可是,每一次创建和销毁这个类,都需要耗费很大的系统资源。
请问:你有什么优化措施?








[解决办法]
如果是单任务的就单例,如果是多任务的可能需要池化
[解决办法]
如果有属性值,尽量不要做成单例,除非做了足够的同步,否则会有并发问题。做成池应该是很好的方案
[解决办法]
池化就想想数据库链接池,通常做JavaWeb开发的都秒懂了。

其实还可以用任务队列的方式,各种MQ。
[解决办法]
赞同2L观点:单任务用单例;多任务用池(为什么用池:为了不让数据共享,可以想象,若每个用户请求都能看到其他人的请求信息,这太不安全了)
附带用代理实现的连接池,供参考:

public class DBProxyUtil {
private static Connection conn = null;
private static List<Connection> pool = new ArrayList<Connection>();
static{
String dirver = "com.mysql.jdbc.Driver";
String uri = "jdbc:mysql:///user?characterEncoding=UTF8";
String name = "root";
String pwd = "root";
try {
//初始化一个含有10个连接的连接池
for(int index = 0;index < 10;index++){
Class.forName(dirver);
conn = DriverManager.getConnection(uri,name,pwd);
  //代理对象
Object obj = Proxy.newProxyInstance(DBProxyUtil.class.getClassLoader(),
new Class[]{Connection.class},  //所需要代理类的接口类
new InvocationHandler(){  //句柄,这里主要拦截代理类方法,除getClass方法外
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
if("close".equals(method.getName())){
//当进行关闭操作是,代理连接不进行关闭操作,将所用连接返回到连接池中
System.out.println("关闭连接。。");
synchronized (pool) {
//将连接放回连接池
pool.add((Connection)proxy);
//唤醒等待的线程
pool.notify();
}
return null;
}else{
//执行除close方法之外的方法,这里的o对象是方法返回值对象
Object o = method.invoke(conn, args);
return o;
}
}

});
pool.add((Connection)obj);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConn(){
synchronized (pool) {
//当连接池中的连接个数为0时,线程进入等待队列
if(pool.size() == 0){
try {
pool.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
return getConn();
}
Connection conn = pool.remove(0);
int i = pool.size();
System.out.println("当前连接池中还有 "+i+" 个连接");
return conn;
}
}
}

热点排行