利用tomcat配置数据库连接池

1。写一个属性文件dbconfig.properties

dbType=oracle9i

driver_class=oracle.jdbc.driver.OracleDriver

host_name=127.0.0.1

port=1521

url=jdbc:oracle:thin:@

username=scott

password=tiger

dbsid=sk

2.建立连接池DBConnectionPool.java

packagecom.sk.javaWeb.utils.dataBase;

importjava.io.IOException;

importjava.io.InputStream;

importjava.sql.Connection;

importjava.sql.DriverManager;

importjava.sql.PreparedStatement;

importjava.sql.ResultSet;

importjava.sql.SQLException;

importjava.util.Date;

importjava.util.Enumeration;

importjava.util.Properties;

importjava.util.Vector;

publicclassDBConnectionPool{

privatestaticDBConnectionPoolinstance=null;

//连接池的名字,因为可能会有多个连接池,依靠名字来对他们进行区分,因为现在只有一个Oracle连接池,所以没什么在用在这里

privateStringname;

//连接字符串

privateString_url="";

//驱动

privateStringdriver="";

//用户名

privateStringusername="";

//密码

privateStringpassword="";

//最大连接数

privateintmaxConn=20;

//当前连接数

privateintcurConn=0;

//空闲的连接

privateVector<Connection>freeConns=newVector<Connection>();

privateDBConnectionPool(){

init();

}

publicvoidinit(){

InputStreamin=this.getClass().getResourceAsStream(

"/com/sk/javaWeb/utils/dataBase/dbconfig.properties");//以流的形式读入属性文件

Propertiesprops=newProperties();

try{

props.load(in);

driver=props.getProperty("driver_class");

username=props.getProperty("username");

password=props.getProperty("password");

_url=props.getProperty("url")+props.getProperty("host_name")

+":"+props.getProperty("port")+":"

+props.getProperty("dbsid");

}catch(IOExceptione){

e.printStackTrace();

}

}

publicstaticDBConnectionPoolgetInstance(){

if(instance==null){

instance=newDBConnectionPool();

}

returninstance;

}

//获得一个连接,如果没有空闲连接并且当前连接数小于最大连接数,就创建一个连接

publicsynchronizedConnectiongetConnection(){

Connectionconn=null;

if(freeConns.size()>0){

//得到空闲连接里面第一个连接

conn=freeConns.firstElement();

freeConns.removeElementAt(0);

try{

//如果得到的这个连接失效了,就释放掉他,然后重新递归的调用本方法

if(conn.isClosed()){

conn=getConnection();

}

}catch(SQLExceptione){

e.printStackTrace();

conn=getConnection();

}

//如果现在没有空闲连接,并且当前连接数小于最大连接数,就新创建一个连接

}elseif(curConn<maxConn){

conn=newConnection();

}

if(conn!=null){

curConn++;

}

returnconn;

}

/**

*从连接池获取可用连接.可以指定客户程序能够等待的最长时间参见前一个getConnection()方法.

*

*@paramtimeout以毫秒计的等待时间限制

*/

publicsynchronizedConnectiongetConnection(longtimeout){

longstartTime=newDate().getTime();

Connectioncon=null;

while((con=getConnection())==null){

try{

wait(timeout);

}catch(InterruptedExceptione){

e.printStackTrace();

}

if((newDate().getTime()-startTime)>=timeout){//wait()返回的原因是超时

returnnull;

}

}

returncon;

}

privateConnectionnewConnection(){

Connectioncon=null;

try{

Class.forName(driver);

con=DriverManager.getConnection(_url,username,password);

}catch(ClassNotFoundExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}catch(SQLExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}

returncon;

}

//释放一个连接

publicsynchronizedvoidfreeConn(Connectionconn){

freeConns.addElement(conn);

curConn--;

notifyAll();

}

//关闭所有连接

publicvoidfreeAllConns(){

Enumeration<Connection>conns=freeConns.elements();

while(conns.hasMoreElements()){

Connectionconn=conns.nextElement();

try{

conn.close();

}catch(SQLExceptione){

e.printStackTrace();

}

}

//除去空闲连接当中的所有连接

freeConns.removeAllElements();

}

publicintgetRowCount(Stringsql){

Connectionconn=getConnection();

introwCount=0;

PreparedStatementps=null;

ResultSetrs=null;

try{

ps=conn.prepareStatement(sql);

rs=ps.executeQuery();

if(rs.next()){

rowCount=rs.getInt(1);

}

}catch(SQLExceptione){

e.printStackTrace();

}finally{

try{

if(ps!=null){

ps.close();

}

if(conn!=null){

this.instance.freeConn(conn);

}

}catch(SQLExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}

}

returnrowCount;

}

}

3.获得连接ConnectionPool.java

packagecom.sk.javaWeb.utils.dataBase;

importjava.sql.Connection;

importjava.sql.SQLException;

importjavax.naming.Context;

importjavax.naming.InitialContext;

importjavax.naming.NamingException;

importjavax.sql.DataSource;

/**

*tomcat配置数据库连接池

*@author沈奎

*日期:2009-9-19下午03:21:43

*版本:0.1

*/

publicclassConnectionPool{

privatestaticConnectionconn=null;

privatestaticDataSourcedataSource=null;

publicstaticConnectiongetConnection(){

try{

Contextcontext=newInitialContext();

dataSource=(DataSource)context.lookup("java:comp/env/oracle");

if(dataSource!=null){

conn=dataSource.getConnection();

}

}catch(NamingExceptione){

e.printStackTrace();

}catch(SQLExceptione){

e.printStackTrace();

}

returnconn;

}

}

相关推荐