使用dbcp数据库连接池连接数据库aaa的代码

db.properties:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/aaa
user=root
password=123


dbcp.properties:

#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/aaa
username=root
password=123

#<!-- 初始化连接 -->
initialSize=10

#最大连接数量
maxActive=50

#<!-- 最大空闲连接 -->
maxIdle=20

#<!-- 最小空闲连接 -->
minIdle=5

#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000


#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名

=property;] 
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包

含他们。
connectionProperties=useUnicode=true;characterEncoding=gbk

#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true

#driver default 指定由连接池所创建的连接的只读(read-only)状态。
#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支

持只读模式,如:Informix)
defaultReadOnly=

#driver default 指定由连接池所创建的连接的事务级别

(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, 

READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED

连接池:

package com.csdn.hbsi.utils;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;

public class DBManager_dbcp {
private static DataSource ds;
static {
  try {
  InputStream in = DBManager.class.getClassLoader()
    .getResourceAsStream("dbcp.properties");
  Properties prop = new Properties();
  prop.load(in);

  ds = BasicDataSourceFactory.createDataSource(prop);

  } catch (Exception e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
}

public static Connection getConnection() throws Exception {
  return ds.getConnection();
}
public static void closeDB(Connection conn,Statement st,ResultSet 

rs){

  if(conn!=null){
  try {
    conn.close();
  } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }
  }
  
  
}
}



package com.csdn.hbsi.utils;

import java.io.InputStream;
import java.io.PrintWriter;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Array;
import java.sql.Blob;
import java.sql.CallableStatement;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.NClob;
import java.sql.PreparedStatement;
import java.sql.SQLClientInfoException;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.sql.SQLXML;
import java.sql.Savepoint;
import java.sql.Statement;
import java.sql.Struct;
import java.util.LinkedList;
import java.util.Map;
import java.util.Properties;

import javax.sql.DataSource;

public class MyJdbcPool implements DataSource {
// 声明静态变量
private static String username;
private static String password;
private static String url;
private static String driver;
// 建立连接池
private static LinkedList<Connection> list = new 

LinkedList<Connection>();
// 连接数据库,建立多个连接对象,把多个连接对象放入连接池
static {
  try {
  InputStream in = DBManager.class.getClassLoader()
    .getResourceAsStream("db.properties");
  Properties prop = new Properties();
  prop.load(in);

  driver = prop.getProperty("driver");
  url = prop.getProperty("url");
  username = prop.getProperty("username");
  password = prop.getProperty("password");

  Class.forName(driver);

  for (int i = 0; i < 10; i++) {
    Connection conn = DriverManager.getConnection(url, username,
      password); // 建立十个连接
    System.out.println("当前池中加入了" + conn); // 为了测试,实际应

用总不用
    list.add(conn); // 把建好的连接放入池中
  }
  // 在java中对一个类的方法进行增强:
  // 1、写一个子类,覆盖原来的父类需要增强的方法。X
  // 2、用包装设计模式对类的方法进行增强 X
  // 3、使用动态代理技术构建连接池中的connection
  } catch (Exception e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
}

public Connection getConnection() throws SQLException {
  if (list.size() > 0) {
  final Connection conn = list.removeFirst();
  System.out.println("用户从池中把"+conn+ "拿走了");
  System.out.println("池当前的大小"+list.size());
  // connection接口将close()方法的调用指派给代理实例去实现,代理实

例实现的代码如下:
  //第一个参数:定义代理类的类加载器
  //第二个参数:代理类要实现的接口列表
  //第三个参数:指派方法调用的调用处理程序
  return (Connection) Proxy.newProxyInstance(MyJdbcPool.class
    .getClassLoader(), conn.getClass().getInterfaces(),
    new InvocationHandler() {

      public Object invoke(Object proxy, Method method,
        Object[] args) throws Throwable {
      if (!method.getName().equalsIgnoreCase("close")) {
        return method.invoke(conn, args);
      }
      System.out.println(conn+"被还回来了");
      list.add(conn);
      System.out.println("池当前的大小"+list.size());
      return null;
      }
    });

  } else {
  throw new RuntimeException("I am sorry,池里没有连接了!");
  }

}

public Connection getConnection(String username, String password)
  throws SQLException {
  // TODO Auto-generated method stub
  return null;
}

public PrintWriter getLogWriter() throws SQLException {
  // TODO Auto-generated method stub
  return null;
}

public int getLoginTimeout() throws SQLException {
  // TODO Auto-generated method stub
  return 0;
}

public void setLogWriter(PrintWriter out) throws SQLException {
  // TODO Auto-generated method stub

}

public void setLoginTimeout(int seconds) throws SQLException {
  // TODO Auto-generated method stub

}

public boolean isWrapperFor(Class<?> iface) throws SQLException {
  // TODO Auto-generated method stub
  return false;
}

public <T> T unwrap(Class<T> iface) throws SQLException {
  // TODO Auto-generated method stub
  return null;
}

}


测试类:

package com.csdn.hbsi.Demo;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import com.csdn.hbsi.utils.DBManager;
import com.csdn.hbsi.utils.DBManager_dbcp;
import com.csdn.hbsi.utils.MyJdbcPool;

public class Demo1 {

/**
  * 测试连接的 类
  * @throws Exception 
  */
public static void main(String[] args) throws Exception {
  Connection conn=null;
  Statement st=null;
  ResultSet rs=null;
// conn=DBManager.getConnection();1、普通连接
// MyJdbcPool mypool=new MyJdbcPool();
  //conn=mypool.getConnection();
  conn=DBManager_dbcp.getConnection();
  
  System.out.println(conn);
  conn.close();
  //做连接数据库后续事情
  //DBManager.closeDB(conn, st, rs);
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值