自己动手写struts笔记3

连接池的接口类:

 

 

package com.gd.jdbc;

 

import java.sql.Connection;

import java.sql.SQLException;

 

//连接池   接口编程

public interface DbConnectionPool {

 

/**

 * 设定连接池中存放连接的数目

 * @param numConnections

 */

public void setMaxConns(int numConnections);

/**

 * 设定打开或者关闭连接池

 * @param onOrOff

 * @throws Exception

 */

public void setConnWitch(String onOrOff)throws Exception;

/**

 * 产生连接池

 * @throws SQLException

 */

public void initConnPool()throws SQLException;

/**

 * 从连接池中获取连接

 * @return

 * @throws SQLException

 */

public Connection getConnection()throws SQLException;

/**

 * 将连接返回给连接池

 * @throws SQLException

 */

public void returnConnection()throws SQLException;

/**

 * 销毁连接池

 * @throws SQLException

 */

public void destroyConnPool()throws SQLException;

}

 

 

 

 

连接池的接口实现类:

package com.gd.jdbc.impl;

 

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

import java.util.Set;

 

import com.gd.jdbc.DbConnectionPool;

 

//连接池的具体实现方式

 

public class GdDbConnectionPool implements DbConnectionPool {

 

private String DB_DRIVER="com.mysql.jdbc.Driver";

private String DB_User="root";

private String DB_PASSWD="shaokai";

private String DATASRC_URL="jdbc:mysql://localhost:3306/myApp";

 

static final int defaultMaxConnections=10;//默认的连接池的大小

private List freeConnections;//存放目前空闲的连接,空闲池

private Map busyConnections;//存放目前正在使用的连接,繁忙池

private int maxConnections;//设定连接池的大小

/**

 * 构造函数

 * @param numConnections

 */

public GdDbConnectionPool(int numConnections){

maxConnections=numConnections;

freeConnections=null;

busyConnections=null;

}

/**

 * 构造函数

 */

public GdDbConnectionPool(){

maxConnections=defaultMaxConnections;

freeConnections=null;

busyConnections=null;

}

public void destroyConnPool()throws SQLException{

//假如还有正在使用的连接

if(busyConnections!=null){

Set set=busyConnections.entrySet();

Iterator iterator=set.iterator();

//销毁正在使用的连接

while(iterator.hasNext()){

Map.Entry map=(Map.Entry)iterator.next();

Connection conn=(Connection)map.getValue();

conn.close();

}

busyConnections=null;

}

//假如还有空闲的连接

if(freeConnections!=null){

//销毁空闲的连接

for(int i=0;freeConnections.size()>i;i++){

Connection conn=(Connection)freeConnections.get(i);

conn.close();

}

freeConnections=null;

}

}

public synchronized Connection getConnection()throws SQLException{

if(freeConnections==null){

throw new SQLException("连接池还没有创建");

}

try{

//表示没有空闲的连接

if(freeConnections.size()==0)

wait();

}catch(InterruptedException e){

e.printStackTrace();

}

//获取空闲池的连接

Connection conn=(Connection)freeConnections.get(0);

freeConnections.remove(0);//在空闲池里销毁已经获取的连接

busyConnections.put(Thread.currentThread(), conn);//将已经获取的连接放在繁忙池里

System.out.println("getConnection:===========================================================");

System.out.println("freeConnections空闲连接有:"+freeConnections.size());

System.out.println("busyConnections繁忙连接有:"+busyConnections.size());

return conn;

}

public void initConnPool()throws SQLException{

try{

freeConnections=new ArrayList(maxConnections);

busyConnections=new HashMap(maxConnections);

//创建连接,并放在连接池中

Class.forName(DB_DRIVER);

// conn=DriverManager.getConnection(DATASRC_URL,DB_User,DB_PASSWD);

// GdDbConnection con=new GdDbConnection(this);

for(int i=0;i<maxConnections;i++){

freeConnections.add(DriverManager.getConnection(DATASRC_URL,DB_User,DB_PASSWD));

}

}catch(Exception e){

freeConnections=null;

busyConnections=null;

throw new SQLException(e.toString());

}

System.out.println("初始化ConnPool:===========================================================");

System.out.println("freeConnections空闲连接有:"+freeConnections.size());

System.out.println("busyConnections繁忙连接有:"+busyConnections.size());

}

public synchronized void returnConnection()throws SQLException{

//从繁忙池中销毁已经返回的连接

Connection conn=(Connection)busyConnections.get(Thread.currentThread());

if(conn==null)

throw new SQLException("没有发现繁忙池中有连接");

busyConnections.remove(Thread.currentThread());

//将已经返回的连接池重新放回空闲池

freeConnections.add(conn);

System.out.println("returnConnection:===========================================================");

System.out.println("freeConnections空闲连接有:"+freeConnections.size());

System.out.println("busyConnections繁忙连接有:"+busyConnections.size());

notify();

}

public void setConnWitch(String onOrOff)throws Exception{

try{

//假如为ON,则表示初始化连接池

if("ON".equalsIgnoreCase(onOrOff)){

initConnPool();

//假如为OFF,则表示销毁连接池

}else if("OFF".equalsIgnoreCase(onOrOff)){

destroyConnPool();

}

}catch(Exception e){

e.printStackTrace();

}

}

public void setMaxConns(int numConnections){

maxConnections=numConnections;

}

 

}

 

 

 

 

连接池的管理类:

 

package com.gd.jdbc;

 

import java.sql.Connection;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import java.util.Set;

 

import com.gd.jdbc.impl.GdDbConnectionPool;

 

//实现连接池的管理类

 

 

public class DbConnectionManager {

 

static private DbConnectionManager instance;//单例模式

private static Map connPool=new HashMap();

/**

 * 返回唯一实例,如果是第一次调用此方法,则创建实例

 * @return

 */

static synchronized public DbConnectionManager getInstance(){

if(instance==null)

instance=new DbConnectionManager();

return instance;

}

/**

 * 防止其他对象创建本类的实例  private 

 */

private DbConnectionManager(){

init();

}

/**

 * 根据名称从Map中获取连接

 * @param names

 * @return

 */

public static Connection getConnection(String names){

Connection conn=null;

try{

//从连接池中获取连接  先获取连接池

DbConnectionPool pool=(GdDbConnectionPool)connPool.get(names);

if(pool!=null)

conn=pool.getConnection();

}catch(Exception e){

e.printStackTrace();

}finally{

return conn;

}

}

/**

 * 将连接返回给连接池

 * @param name

 * @param conn

 */

public static void returnConnection(String name,Connection conn){

try{

DbConnectionPool pool=(GdDbConnectionPool)connPool.get(name);

if(pool!=null)

pool.returnConnection();

}catch(Exception e){

e.printStackTrace();

}

}

/**

 * 关闭所有连接

 */

public synchronized void release(){

try{

Set set=connPool.entrySet();

Iterator iterator=set.iterator();

while(iterator.hasNext()){

Map.Entry map=(Map.Entry)iterator.next();

DbConnectionPool pool=(GdDbConnectionPool)map.getValue();

//关闭连接池

pool.setConnWitch("OFF");

}

connPool=null;

}catch(Exception e){

e.printStackTrace();

}

}

/**

 * 创建连接池

 */

private void createPools(){

DbConnectionPool pool=new GdDbConnectionPool();

//设定连接池的大小

pool.setMaxConns(10);

try{

//表示创建连接池

pool.setConnWitch("ON");

//将创建后的连接池放入Map,mysql表示是用于连接MySQL数据库

connPool.put("mysql", pool);

}catch(Exception e){

e.printStackTrace();

}

}

/**

 * 初始化

 */

private void init(){

//创建连接池

createPools();

}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值