初次写了一个类,想封装一下数据库操作,JSP执行耗时增加很多?

时间:2022-12-11 15:19:14
我想用这种方式使用数据库
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,能提高效率吗?

10 个解决方案

#1


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

#2


对象太多了。建议用数据库连接池

#3


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

}
public boolean update(String sql,Object...arg){

}
public void close(){

}

#4


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

#5


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

#6


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

#7


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

#8


谢谢楼上几位解答。
我再补充说明一点,我的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毫秒左右。
也许作为新手,应先关心功能的实现,而不应关注代码执行效率。
但我很纳闷,为什么相差这么大。

#9


引用 8 楼 sstfwd 的回复:
谢谢楼上几位解答。
我再补充说明一点,我的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毫秒左右。
也许作为新手,应先关心功能的实现,而不应关注代码执行效率。
但我很纳闷,为什么相差这么大。
数据库线程池的建立,数据库连接的建立,都是很耗时的操作。你不能每次都去初始化这些东西吧。最好用连接池管理起来。

#10


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

#1


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

#2


对象太多了。建议用数据库连接池

#3


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

}
public boolean update(String sql,Object...arg){

}
public void close(){

}

#4


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

#5


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

#6


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

#7


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

#8


谢谢楼上几位解答。
我再补充说明一点,我的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毫秒左右。
也许作为新手,应先关心功能的实现,而不应关注代码执行效率。
但我很纳闷,为什么相差这么大。

#9


引用 8 楼 sstfwd 的回复:
谢谢楼上几位解答。
我再补充说明一点,我的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毫秒左右。
也许作为新手,应先关心功能的实现,而不应关注代码执行效率。
但我很纳闷,为什么相差这么大。
数据库线程池的建立,数据库连接的建立,都是很耗时的操作。你不能每次都去初始化这些东西吧。最好用连接池管理起来。

#10


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