自行建立连接池。
关键代码:
(1)
db.properties//外部配置文件(名值对的方式)
driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
url=jdbc:sqlserver://localhost:1433
username=sa
password=123456
jdbcPoolInitSize=10//容量;PoolSize=maxSize
(2)JdbcPool.java
packageex4;
importjava.io.InputStream;
importjava.io.PrintWriter;
importjava.lang.reflect.InvocationHandler;
importjava.lang.reflect.Method;
importjava.lang.reflect.Proxy;
importjava.sql.*;
importjava.util.*;
importjava.util.logging.Logger;
importjavax.sql.DataSource;
publicclass JdbcPool implements DataSource{
private staticLinkedList<Connection> listConnections=newLinkedList<Connection>();//动态改变,用LinkedList效率高;因为这个连接在这个类中只有一个实例,所以声明为类变量形式(privatestatic),在这个实例中有一个LinkedList来保存Connection对象——工具。
static{//初始化数据库连接池
InputStreamin=JdbcPool.class.getResourceAsStream("db.properties");
//加载类的路径,访问的过程
Properties prop=new Properties();//建立Properties工具类
try{
prop.load(in);//加载流
//获取文件中所有参数的信息
Stringdriver=prop.getProperty("driver");
Stringurl=prop.getProperty("url");
Stringusername=prop.getProperty("username");
Stringpassword=prop.getProperty("password");
intjdbcPoolInitSize=Integer.parseInt(prop.getProperty("jdbcPoolInitSize"));
Class.forName(driver);
for(inti=0;i<jdbcPoolInitSize;i++){//声明10个connection实例,并将这10个实例添加到listConnections链表中
Connectionconn=DriverManager.getConnection(url, username, password);
System.out.println("链接的数量"+conn);
listConnections.add(conn);
}
}catch(Exception e){
e.printStackTrace();
}
}
@Override
public PrintWriter getLogWriter() throwsSQLException {
// TODO Auto-generated method stub
return null;
}
@Override
public int getLoginTimeout() throwsSQLException {
// TODO Auto-generated method stub
return 0;
}
@Override
public Logger getParentLogger() throwsSQLFeatureNotSupportedException {
// TODO Auto-generated method stub
return null;
}
@Override
public void setLogWriter(PrintWriter out)throws SQLException {
// TODO Auto-generated method stub
}
@Override
public void setLoginTimeout(int arg0)throws SQLException {
// TODO Auto-generated method stub
}
@Override
public boolean isWrapperFor(Class<?>arg0) throws SQLException {
// TODO Auto-generated method stub
return false;
}
@Override
public <T> T unwrap(Class<T>arg0) throws SQLException {
// TODO Auto-generated method stub
return null;
}
@Override
public Connection getConnection() throwsSQLException {
// TODO Auto-generated method stub
if(listConnections.size()>0){
final Connectionconn=listConnections.removeFirst();//取链表中第一个元素,并从链表中移除它,链表长度-1,资源分配给用户
System.out.println("空闲链接的数量"+listConnections.size());
return (Connection)Proxy.newProxyInstance(JdbcPool.class.getClassLoader(),conn.getClass().getInterfaces(),new InvocationHandler() {//动态代理的方式,代理Connection对象,调用的时候调用它;newInvocationHandler()来自反射的这个类
@Override
public Objectinvoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODOAuto-generated method stub
if(!method.getName().equals("close")){//调用非close方法
returnmethod.invoke(conn, args);
}else{//调用close方法
listConnections.add(conn);
System.out.println(conn+"释放了链接");
System.out.println("链接的数量"+listConnections.size());
returnnull;
}
}
} );
}else{//连接池中无连接,抛出异常
throw newRuntimeException("链接已满");
}
}
@Override//因为初始化提供了用户名和密码,所以没写这个函数
public Connection getConnection(Stringusername, String password) throws SQLException {
// TODO Auto-generated method stub
return null;
}
}
(3)JdbcUtil.java
packageex4;
importjava.sql.Connection;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.sql.Statement;
publicclass JdbcUtil {//建立包装类,工具类
private static JdbcPool pool=newJdbcPool();
public static ConnectiongetConnection()throws SQLException{
return pool.getConnection();
}
public static void release(Connectionconn,Statement st,ResultSet rs){
//释放Connection类,及建立在其基础上的两个类
if(rs!=null){
try{
rs.close();
}catch(Exception e){
e.printStackTrace();
}
rs=null;
}
if(st!=null){
try{
st.close();
}catch(Exception e){
e.printStackTrace();
}
st=null;
}
if(conn!=null){
try{
conn.close();
}catch(Exception e){
e.printStackTrace();
}
conn=null;
}
}
}
(4)Main.java
packageex4;
importjava.sql.Connection;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.sql.Statement;
publicclass Main {
public static void main(String[] args){
try{
Connectionconn=JdbcUtil.getConnection();
//由于JdbcUtil是工具类,所以直接调用它的方法
Statementstmt=conn.createStatement();
String sql="selectsn,sex from [EDUCATION].[dbo].[Student]";
ResultSetrs=stmt.executeQuery(sql);
while(rs.next()){
System.out.println(rs.getString("sn")+""+rs.getString("sex"));
}
JdbcUtil.release(conn, stmt,rs);//释放,添加连接池
}catch(SQLException e){
e.printStackTrace();
}
}
}