我想用这种方式使用数据库
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,能提高效率吗?

解决方案 »

  1.   

    你每次调用 jsp,都 new 一个 DataSource,这执行速度不慢才怪。
      

  2.   

    想法是好的,你想封装数据库的操作,也就需要自己写一个DAO,但是代码写的不对,给你个建议:
    JDBC的操作大致可分为下面三类,具体细节和实现自己写吧,比如加载驱动的代码可以写到静态块等等
    public List query(String sql,Object...arg){}
    public boolean update(String sql,Object...arg){}
    public void close(){}
      

  3.   

    第一,调用完了是不是应该释放资源呢conn以及rs资源呢?
    第二,jsp什么时候加载的?能否在启动的时候就完成最基本的工作,JSP直接执行查询就好?
      

  4.   

    1.执行完成后应该释放Connection,PreparedStatement,Resultset资源, 不然你的数据库会爆掉
    2.jsp在用户请求这个jsp的时候加载 .可以在启动的时候完成最基本的工作 .可以自己写servlet和listener完成初始化工作
      

  5.   

    关键在于这个类DbO new多了,你这个是基于JNDI的连接池,池子里有很多连接了,每次用每次取,用完了送回去了就行了,不用每次都new新对象,
      

  6.   

    将取数据库连接和数据库操作分开写,每次都在finally中关数据库连接。应该会好些
     
      

  7.   

    谢谢楼上几位解答。
    我再补充说明一点,我的JSP功能相当简单,在JSP里直接执行Context ctx=new InitialContext();
    DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/xxx");conn=ds.getConnection();
    psm=conn.prepareStatement(sql);
    rs=psm.executeQuery();
    while(rs.next()){...}
    耗时5毫秒以内,1、2毫秒很多见。
    用上一楼的DbO类,这个JSP里只new了一个实例对象,JSP服务器端执行耗时就要30毫秒左右。
    也许作为新手,应先关心功能的实现,而不应关注代码执行效率。
    但我很纳闷,为什么相差这么大。
      

  8.   

    请教版主defonds,在类中使用JNDI连接池毫无优势,需要自己写连接池的类吗?
    还是用Hibernate之类的?