传统JDBC的操作,对连接的对象销毁不是特别好,每次创建和销毁连接都是需要花费时间。可以使用连接池优化的程序。
在程序开始的时候,可以创建几个连接,将连接放入到连接池中.用户使用连接的时候,可以从连接池中进行获取.用完之后,可以将连接归还连接池。
代码:
public class MyDataSource implements DataSource{
// 创建一个List集合用于存放多个连接对象.
private List list = new ArrayList();
// 在程序开始的时候,初始化几个连接,将连接存放到list中.
public MyDataSource() {
// 初始化3个连接:
for(int i=1;i<=3;i++){
Connection conn = JDBCUtils.getConnection();
list.add(conn);
}
}
@Override
// 获得连接的方法:
public Connection getConnection() throws SQLException {
if(list.size() <= 0){
for(int i=1;i<=3;i++){
Connection conn = JDBCUtils.getConnection();
list.add(conn);
}
}
Connection conn = list.remove(0);
return conn;
}
// 归还连接的方法:
public void addBack(Connection conn){
list.add(conn);
}
...
}
继承和装饰者的方式:
//继承的方式增强一个类中某个方法:
class Man{
public void run(){
System.out.println("吃....");
}
}
class SuperMan extends Man{
public void run(){
// super.run();
System.out.println("走....");
}
}
//使用装饰者的方式完成类的方法的增强
interface Student{
public void study();
}
class Students implements Student{
public void study() {
System.out.println("可以的...");
}
}
class Studentss implements Student{
private Student studenter;
public Studentss(Student studenter) {
this.studenter = studenter;
}
public void study() {
System.out.println("学习...");
// this.student.server();
}
}
使用装饰者模式增强Connection的close方法:
public class MyConnection implements Connection{
private Connection conn;
private List list;
public MyConnection(Connection conn,List list) {
this.conn = conn;
this.list = list;
}
public void close() throws SQLException {
list.add(conn);
}
...
}
连接池的getConnection方法:
// 获得连接的方法:
public Connection getConnection() throws SQLException {
if(list.size() <= 0){
for(int i=1;i<=3;i++){
Connection conn = JDBCUtils.getConnection();
list.add(conn);
}
}
Connection conn = list.remove(0);
MyConnection myConn = new MyConnection(conn, list);//获取连接
return myConn;
}
DBCP:
DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要2个包:commons-dbcp.jar,commons-pool.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。
C3P0:
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定(Java Naming and Directory Interface,Java命名和目录接口),支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
Tomcat内置连接池:
使用Tomcat服务器内置的数据库连接池的局限在于,一是这个工程必须是web工程,而不能是一般的Java工程;二是我们必须在服务器启用之前就要将数据库连接池配置好,这就要看情况了,如果我们在启用Tomcat之前没配置数据库连接池的话,那么后面的web应用一般也就不会使用内置的数据库连接池了,毕竟一般服务器不会随便停用。其实要想使用Tomcat内置的数据库连接池,也很简单,就将数据库的驱动jar包(例如mysql-connector-java-5.1.37.jar)放置在Tomcat的【lib】目录下。
//手动方式:
public void demo1(){
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///web_07");
dataSource.setUsername("root");
dataSource.setPassword("123");
try{
// 获得连接:
conn = dataSource.getConnection();
// 编写SQL:
String sql = "select * from category";
// 预编译SQL:
stmt = conn.prepareStatement(sql);
// 执行SQL:
rs = stmt.executeQuery();
while(rs.next()){
System.out.println(rs.getInt("cid")+" "+rs.getString("cname"));
}
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.release(rs,stmt, conn);
}
}
//配置文件方式:
public void demo2(){
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
Properties properties = new Properties();
try{
properties.load(new FileInputStream("src/dbcpconfig.properties"));
DataSource dataSource = BasicDataSourceFactory.createDataSource(properties);
// 获得连接:
conn = dataSource.getConnection();
// 编写SQL:
String sql = "select * from category";
// 预编译SQL:
stmt = conn.prepareStatement(sql);
// 执行SQL:
rs = stmt.executeQuery();
while(rs.next()){
System.out.println(rs.getInt("cid")+" "+rs.getString("cname"));
}
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.release(rs,stmt, conn);
}
}
学习链接:
C3P0连接池--> https://www.cnblogs.com/ygj0930/p/6405861.html
DBUtils学习--> https://www.cnblogs.com/CQY1183344265/p/5854418.html
Tomcat内置连接池--> https://www.cnblogs.com/fjdingsd/p/5273187.html