自定义连接池一: 1.sun提供了一个连接池接口 javax.sql.DataSource。 2.定义连接池MyDataSource实现接口DataSource。 3.使用集合LinkedList<Connection> pool存放多个连接对象。LinkedList移除添加操作效率高。连接对象还是和以前一样调用工具类JDBCUtils里的getConnection。(第一篇JDBC的有介绍) 4.书写获取连接的方法getConnection(),获取连接改为从池子中拿对象。 5.书写归还连的方法backConnection()。把从池子pool中获取的对象归还。 我们需要三个类:
1.JDBCUtils(第一篇JDBC的随笔有介绍如何书写)
2.MyDataSource
3.TestMyDataSource
注:测试用的Junit。
一、书写MyDataSource方法,此处不实现接口DataSource
package com.it.JDBC; import java.sql.Connection; import java.util.LinkedList; /** * @author Payphone * @time 2017-10-07 自定义连接池,未增强close方法 * */ public class MyDataSource { private static Connection conn; private static LinkedList<Connection> pool = new LinkedList<Connection>(); /** * 构造方法初始化连接池个数,也可用静态代码块初始化。 * */ public MyDataSource() { for (int i = 0; i < 5; i++) { conn = JDBCUtils.getConnection(); pool.add(conn); } System.out.println("---------分割线---------"); } /** * 获取连接 * */ public Connection getConnection() { System.out.println("连接前的个数:" + pool.size()); conn = pool.remove(0); System.out.println("连接后的个数:" + pool.size()); return conn; } /** * 归还连接 * */ public void backConnection() { System.out.println("释放连接前的个数:" + pool.size()); pool.add(conn); System.out.println("释放连接后的个数:" + pool.size()); } }
二、书写测试方法TestMyDataSource
package com.it.TestJDBC;
import java.sql.Connection;
import java.sql.PreparedStatement;
import org.junit.Test;
import com.it.JDBC.JDBCUtils;
import com.it.JDBC.MyDataSource;
public class TestMyDataSource {
@Test
public void testAddUser() {
Connection conn = null;
MyDataSource md = new MyDataSource();
PreparedStatement psmt = null;
try {
conn = md.getConnection();
String sql = "insert into t_user(id,pwd) values(?,?)";
psmt = conn.prepareStatement(sql);
psmt.setInt(1, 2015005);
psmt.setString(2, "2015005");
int rows = psmt.executeUpdate();
if (rows > 0) {
System.out.println("插入数据成功!");
} else {
System.out.println("插入数据失败!");
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
JDBCUtils.Release(null, psmt, null);
md.backConnection();
}
}
}
import java.sql.Connection;
import java.sql.PreparedStatement;
import org.junit.Test;
import com.it.JDBC.JDBCUtils;
import com.it.JDBC.MyDataSource;
public class TestMyDataSource {
@Test
public void testAddUser() {
Connection conn = null;
MyDataSource md = new MyDataSource();
PreparedStatement psmt = null;
try {
conn = md.getConnection();
String sql = "insert into t_user(id,pwd) values(?,?)";
psmt = conn.prepareStatement(sql);
psmt.setInt(1, 2015005);
psmt.setString(2, "2015005");
int rows = psmt.executeUpdate();
if (rows > 0) {
System.out.println("插入数据成功!");
} else {
System.out.println("插入数据失败!");
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
JDBCUtils.Release(null, psmt, null);
md.backConnection();
}
}
}
自定义连接池一代码并不完善,我们调用了工具类JDBCUtils.Release方法释放了除conn外的对象。又调用了md.backConnection方法归还conn。
在自定义连接池二的代码中我们将增强close方法。调用工具类JDBCUtils.Release方法归还连接。