问问大家我下面的连接池写的那么简单。为什么网上的写的连接池写得那么复杂啊;到底我这里写有什么问题呢。缺点呢。
我的环境:weblogic+webserver.war。
现在系统正在运行,也就是说这样写可以用
import javax.sql.*;
import java.sql.*;
import javax.naming.*;
public class Connect {
public Connection getConnection() throws SQLException
{
javax.sql.DataSource ds=null;
java.sql.Connection conn=null;
javax.naming.Context ctx=null;
try
{
ctx= new InitialContext();
ds = (DataSource) ctx.lookup("oracleserver");
conn = ds.getConnection();
}
catch(javax.naming.NamingException e)
{
e.printStackTrace();
}
finally
{
ctx=null;
}
return conn;
}
}
问题;
1 我这个有什么缺点.
2 这里的类 方法如果改成静太(static)的他们之间的效率会有什么不同呢。
3 还有个问题.我在jsp页面里面查询一个数据集的时候,比喻:
while(rst.next)
{
如果在这里要出来很多事情,所以就不能关闭rst,也就不能关闭连接了(conn),如果同时有几个人访问那不是一下子就用完了连接呢.不知是否有什么好的方法呢。
}
我的环境:weblogic+webserver.war。
现在系统正在运行,也就是说这样写可以用
import javax.sql.*;
import java.sql.*;
import javax.naming.*;
public class Connect {
public Connection getConnection() throws SQLException
{
javax.sql.DataSource ds=null;
java.sql.Connection conn=null;
javax.naming.Context ctx=null;
try
{
ctx= new InitialContext();
ds = (DataSource) ctx.lookup("oracleserver");
conn = ds.getConnection();
}
catch(javax.naming.NamingException e)
{
e.printStackTrace();
}
finally
{
ctx=null;
}
return conn;
}
}
问题;
1 我这个有什么缺点.
2 这里的类 方法如果改成静太(static)的他们之间的效率会有什么不同呢。
3 还有个问题.我在jsp页面里面查询一个数据集的时候,比喻:
while(rst.next)
{
如果在这里要出来很多事情,所以就不能关闭rst,也就不能关闭连接了(conn),如果同时有几个人访问那不是一下子就用完了连接呢.不知是否有什么好的方法呢。
}
程序开发,存在很多问题:首先,每一次Web请求都要建立一次数据库连接。建立连接是一个费时的活动,每次都得花费0.05s~1s的时间,而且系统还要分配内存资源。这个时间对于一次或几次数据库操作,或许感觉不出系统有多大的开销。可是对于现在的Web应用,尤其是大型电子商务网站,同时有几百人甚至几千人在线是很正常的事。在这种情况下,频繁的进行数据库连接操作势必占用很多的系统资源,网站的响应速度必定下降,严重的甚至会造成服务器的崩溃。不是危言耸听,这就是制约某些电子商务网站发展的技术瓶颈问题。其次,对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将不得不重启数据库。还有,这种开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃
-----------------------------------------对于共享资源,有一个很著名的设计模式:资源池(Resource Pool)。该模式正是为了解决资源的频繁分配﹑释放所造成的问题。为解决上述问题,可以采用数据库连接池技术。数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况,为系统开发﹑测试及性能调整提供依据---------------------------
1 我这个有什么缺点.
基本上没什么缺点,但这个类里最好再写一个closeConnection的方法, DataSource 提升为实例变量,也不用每次拿CONNECTION都去LOOKUP,拿过一次就留着了。Connect类singleton起来。
实际很多简单的项目里也就是这样写了。
改进:
import javax.sql.*;
import java.sql.*;
import javax.naming.*;
public class Connect {
private javax.sql.DataSource ds=null;
public Connection getConnection() throws SQLException
{
java.sql.Connection conn=null;
javax.naming.Context ctx=null;
try
{
if (ds != null) return ds;
ctx= new InitialContext();
ds = (DataSource) ctx.lookup("oracleserver");
conn = ds.getConnection();
}
catch(javax.naming.NamingException e)
{
e.printStackTrace();
}
finally
{
ctx=null;
}
return conn;
}
}2 这里的类 方法如果改成静太(static)的他们之间的效率会有什么不同呢。
STATIC也可,没什么大问题3 还有个问题.我在jsp页面里面查询一个数据集的时候,比喻:
while(rst.next)
{
如果在这里要出来很多事情,所以就不能关闭rst,也就不能关闭连接了(conn),如果同时有几个人访问那不是一下子就用完了连接呢.不知是否有什么好的方法呢。
}
要看你这个循环里到底有多少长事务,其实也不过是和ResultSet相关的get,set,除非你查询千万级别的数据量,否则你认为的很多事情,对计算机来说也就是一瞬,那请你讲清楚到底有多少事情在这个循环里处理的,和数据库不想关的,拿到外面来,关闭了连接再做。