Tomcat + SQL SERVER 2000 連接池(討論)
Tomcat中SERVER.XML配置:
<Context path="/bizcity" docBase="bizcity" debug="0">
<Resource name="jdbc/bizcity" auth="Container" type="javax.sql.DataSource" />
<ResourceParams name="jdbc/bizcity">
<parameter><name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter><name>driverClassName</name> <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
</parameter>
<parameter><name>url</name> <value>jdbc:microsoft:sqlserver://192.168.10.1:1433;DataBaseName=BizCity</value>
</parameter>
<parameter><name>username</name><value>sa</value></parameter>
<parameter><name>password</name><value>123456</value></parameter>
<parameter><name>maxActive</name><value>20</value></parameter>
<parameter><name>maxIdle</name><value>10</value></parameter>
<parameter><name>maxWait</name><value>-1</value></parameter>
</ResourceParams>
</Context>
代碼部分:
package biz;
import java.sql.*;
import javax.sql.*;
import java.util.Vector;
import java.util.Date;
import javax.naming.*;
public class connpool{ // 連接池類
private int maxconn; //最大連接數
private int nActive; //已創建的連接數
private Vector freeCons=new Vector(); //存儲當前可用連接的數組
private Context initCtx = null;
private Context ctx =null;
private DataSource ds=null;
public connpool()
{
this.maxconn=20;
this.nActive =0;
try{
initCtx = new InitialContext();
if(initCtx==null) throw new Exception("Initial Failed!");
ctx = (Context) initCtx.lookup("java:comp/env");
//szJdbc="jdbc/bizcity" 此值在Tomcat的SERVER.XML文件中配置
if(ctx!=null) ds= (DataSource) ctx.lookup("jdbc/bizcity");
if(ds==null) throw new Exception("Look up DataSource Failed!");
}
catch(Exception e){
System.out.println(e.getMessage());
}
}
public void SetMaxConn(int n){//默認最大連接數為 20 ~ 200;
if(n<20) n=20;
if(n>200) n=200;
this.maxconn =n;
}
public synchronized void freeConnection(Connection con) //歸還連接
{
try{
if(con.isClosed()){
con=null; //System.out.println("Connection is Closed\n");
}
else{
freeCons.addElement(con);
System.out.println("Add Exists Connection,Current Conut=" + freeCons.size());
}
}
catch(Exception e){System.out.println(e.getMessage());}
//notifyAll();
}
public synchronized Connection getConnection(long timeout) //取得一個連接(指定超時時間)
{
long startTime=new Date().getTime(); //記錄超時用
Connection con=null;
while(con==null){
if(freeCons.size()>0){//在有可用的連接時,選用可用連接
con=(Connection) freeCons.firstElement(); //從數組中取得第一個
freeCons.removeElementAt(0); //並從數組中刪除
try{
if(con.isClosed()){ //如果已關閉,則將已創建連接減一
nActive--;
con=null;
}
}
catch(Exception e){System.out.println(e.getMessage());}
if(con!=null) System.out.println("Get Exists Connection\n");
}else if(nActive<maxconn){ //沒有可用連接且已創建的連接數小于最大數時,創建新連接
con=newConnection();
if(con!=null) System.out.print("Create New Connection ******" + nActive );
}
if(con!=null) break; //取得可用連接後,則直接退出等待
//否則,進行等待0.5s,進行下一次獲取連接的操作
try{
wait(500); //等待0.5秒
}
catch(InterruptedException e) {}
if((new Date().getTime()-startTime)>=timeout){
System.out.println("Connection timeout\n");
break; //超時則退出
}
}
return con;
}
public void release(){ //關閉所有連接
int i=freeCons.size();
int j=0;
for (j=0;j<i;j++){
Connection con=(Connection)freeCons.elementAt(j);
try{
con.close();
}
catch(SQLException e) {
System.out.println("無法關閉連接池中的當前連接");
}
}
freeCons.removeAllElements();
nActive=0;
}
private Connection newConnection(){ //創建一個新連接
Connection con=null;
try{
con=ds.getConnection();
if(con==null) throw new Exception("Create Connection Failed!");
else nActive++;
}
catch(Exception e){
System.out.println(e.getMessage());
}
return con;
}
}
JSP調用:
<%@ page language="java" import="java.sql.*"%>
<jsp:useBean id="vCon" scope="application" class="biz.connpool"/>
<%!
Connection con=null;
java.sql.Statement stmt=null;
%>
<%
try{
if(con==null) con=vCon.getConnection(10000); //最大等待時間為10s
stmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
}
catch(Exception e){
System.err.println(e.getMessage());
}
ResultSet rs=stmt.executeQuery("Select *........");
........
stmt.close();
vCon.freeConnection(con);
con=null;
%>
我已調試通過connpool.java,通過Get Exists Connection 和Create New Connection後台信息,查看取得的連接,通過Add Exists Connection後台信息查看歸還連接情況
不知大家有什麼好的連接池代碼,可以相互討論一下.
问题点数:100、回复次数:11Top
1 楼luckyfanjian(luckyfan)回复于 2003-08-04 09:04:04 得分 20
你的代码应该算是不错的了!
不过最好能写一个缓冲池!这样用完的连接线不关闭,放到缓冲池中,然后又需要连接的地方
先到缓冲池中去找,如果有,就取出,如果没有,在新建连接
然后等服务重起的时候在清空缓冲池,这样可以节省时间!节省建立连接的资源
另外建议你可以自己写一个连接池,不用tomcat的连接池!Top
2 楼cen8535(小虫)回复于 2003-08-04 09:17:14 得分 10
为什么,不用tomcat的连接池?使用自己写的连接池有什么好处吗?Top
3 楼xinshou1979330(Success.java)回复于 2003-08-04 09:22:47 得分 10
声明:我不是来蹭分的
主要是学习
Top
4 楼xhongyang(冷月畅晚)回复于 2003-08-04 09:27:19 得分 10
网上有很多比较完善的连接池程序了,自己写意义不大。Top
5 楼Leemaasn(小鸟)回复于 2003-08-04 09:30:52 得分 10
分析ing。。。Top
6 楼kongxiangli(笑看红尘)回复于 2003-08-04 09:37:25 得分 10
学习Top
7 楼Frank_Xu()回复于 2003-08-04 12:50:19 得分 0
我上面的連接池代碼,
如果用戶惡意不斷刷新,有時導致佔用連接而不能及時歸還.
能不能在客戶端取得連接後,超過一定時間,自動歸還..Top
8 楼Frank_Xu()回复于 2003-08-09 11:58:28 得分 0
再UP一次,沒人回復就結貼.Top
9 楼lynx1111(任我行:一个PLMM看着就兴奋的男人)回复于 2003-08-09 12:04:21 得分 10
声明:我不是来蹭分的
主要是学习Top
10 楼xinshou1979330(Success.java)回复于 2003-08-09 12:26:10 得分 10
声明:我不是来蹭分的
主要是学习
Top
11 楼yshgfly(我是谁)回复于 2003-08-09 12:43:33 得分 10
声明:我不是来蹭分的
主要是学习
Top
相关问题
- Apache + tomcat + jdk2+php + sql server配置办法
- 新手求助:请提供一个(tomcat+sql server)的数据库连接池的实例
- sql server连接池问题
- tomcat连接sql server如何配置环境?
- 请问tomcat连接sql server是不是这样连?谢谢!
- tomcat究竟如何配置sql server的驱动啊
- 求Apache + tomcat + jdk2+php + sql server配置办法
- 求Apache + tomcat + jdk2+php + sql server配置办法
- 究竟是用Struts的连接池好还是用tomcat的连接池好?还有struts的SQL Server连接池怎么配置啊?在线给分
- SQL Server



