初次写了一个类,想封装一下数据库操作,JSP执行耗时增加很多?
我想用这种方式使用数据库
String sql="...";
DbO dbO1=new DbO(sql);
dbO1.psm.setString(1,astr);
ResultSet rs=dbO1.executeQuery();
dbO1.close();
因此,我写了一个很怪的类:
public class DbO{
private Connection conn;
public PreparedStatement psm;
public DbO(String sql){
try{
Context ctx=new InitialContext();
DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/xxx");
conn=ds.getConnection();
psm=conn.prepareStatement(sql);
}catch(Exception e){
e.printStackTrace();
}
}
public ResultSet executeQuery(){
ResultSet rs=null;
try{
rs=psm.executeQuery();
}catch(Exception e){
e.printStackTrace();
}
return rs;
}
}
可是,为何服务器端JSP执行耗时增加很多?
我也没有用<jsp:useBean>,直接把DbO当普通的类也用,new了一个。
怎么改善执行效率啊?
若改成符合规范的JavaBean,能提高效率吗?
------解决方案--------------------你每次调用 jsp,都 new 一个 DataSource,这执行速度不慢才怪。
------解决方案--------------------对象太多了。建议用数据库连接池
------解决方案--------------------想法是好的,你想封装数据库的操作,也就需要自己写一个DAO,但是代码写的不对,给你个建议:
JDBC的操作大致可分为下面三类,具体细节和实现自己写吧,比如加载驱动的代码可以写到静态块等等
public List query(String sql,Object...arg){
}
public boolean update(String sql,Object...arg){
}
public void close(){
}
------解决方案--------------------第一,调用完了是不是应该释放资源呢conn以及rs资源呢?
第二,jsp什么时候加载的?能否在启动的时候就完成最基本的工作,JSP直接执行查询就好?
------解决方案--------------------1.执行完成后应该释放Connection,PreparedStatement,Resultset资源, 不然你的数据库会爆掉
2.jsp在用户请求这个jsp的时候加载 .可以在启动的时候完成最基本的工作 .可以自己写servlet和listener完成初始化工作
------解决方案--------------------关键在于这个类DbO new多了,你这个是基于JNDI的连接池,池子里有很多连接了,每次用每次取,用完了送回去了就行了,不用每次都new新对象,
------解决方案--------------------将取数据库连接和数据库操作分开写,每次都在finally中关数据库连接。应该会好些
------解决方案--------------------数据库线程池的建立,数据库连接的建立,都是很耗时的操作。你不能每次都去初始化这些东西吧。最好用连接池管理起来。