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);
}
}
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);
}
}