JDBC连接池
java JDBC连接中用到Connection 在每次对数据进行增删查改 都要 开启 、关闭 ,在实例开发项目中 ,浪费了很大的资源 ,以下是之前连接JDBC的案例
packagecom.jdbc.connection;importjava.io.IOException;importjava.io.InputStream;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.util.Properties;public classjdbcConnection {private staticString driver;private staticString url;private staticString username;private staticString password;/*** 静态代码块加载配置文件信息*/
static{try{//1.通过当前类获取类加载器
ClassLoader classLoader = jdbcConnection.class.getClassLoader();//2.通过类加载器的方法获得一个输入流
InputStream is = classLoader.getResourceAsStream("db.properties");//3.创建一个properties对象
Properties props = newProperties();//4.加载输入流
props.load(is);//5.获取相关参数的值
driver = props.getProperty("driver");
url= props.getProperty("url");
username= props.getProperty("username");
password= props.getProperty("password");
}catch(IOException e) {
e.printStackTrace();
}
}/*** 获取连接方法
**/
public staticConnection getConnection() {
Connection conn= null;try{
Class.forName(driver);
conn=DriverManager.getConnection(url, username, password);
}catch(Exception e) {
e.printStackTrace();
}returnconn;
}/*** 释放资源方法
*
*@paramconn
*@parampstmt
*@paramrs*/
public static voidrelease(Connection conn, PreparedStatement pstmt, ResultSet rs) {if (rs != null) {try{
rs.close();
}catch(SQLException e) {
e.printStackTrace();
}
}if (pstmt != null) {try{
pstmt.close();
}catch(SQLException e) {
e.printStackTrace();
}
}if (conn != null) {try{
conn.close();
}catch(SQLException e) {
e.printStackTrace();
}
}
}
}
考虑节省资源 ,可以创建一个connection连接池 ,每次使用connection连接时 ,直接从连接池中取出一个连接,不用时再放回连接池 ,代替之前的关闭连接 。 java提供了javax.sql.DataSource 接口 ,各大连接池厂商直接实现这个接口
常见的连接池有C3P0 DBCP连接池
自定义连接池
在上面代码的基础上添加一个自定义连接池,减少对资源的浪费
1.创建一个类实现javax.jdbc.dataSource 类
2.创建一个 存放多个连接的容器 ,因为需要经常删除 ,查找 。 这里用LinkedList 容器
3.在MyDataSource类中静态代码块中创建多个连接,添加到连接池容器中 (这里面创建连接可以直接使用 com.jdbc.connection包中的jdbcConnection 中的静态方法getConnection)
1 static{2 for (int i = 0; i < 5; i++) {3 Connection conn=jdbcConnection.getConnection();4
5 }6 }
4.重写Datasource 方法中的 getConnection() 方法 ,
注:在使用pool这个变量之前需要判断pool是否为空 ,若为空需要重新创建
4.在MyDataSource方法中添加 一个 把当前连接归还给连接池的方法
public voidaddBack(Connection conn){
pool.add(conn);
}
具体操作代码如下
packagecom.jdbc.dataSource;importjava.io.PrintWriter;importjava.sql.Connection;importjava.sql.SQLException;importjava.sql.SQLFeatureNotSupportedException;importjava.util.LinkedList;importjava.util.logging.Logger;importjavax.sql.DataSource;importcom.jdbc.connection.jdbcConnection;public class MyDataSource implementsDataSource {private static LinkedList pool=new LinkedList