菜菜小鸡开启博客的第一天
数据库连接池
数据库连接池是什么
如果一个项目需要多个数据库连接,就要不断获取连接,断开连接,这样大大浪费了资源。而连接池可以管理Connection,在初始化时获取多个Connection对象,这些Connection对象放入LinkedList(双向链表)中,当程序请求连接时,就对LinkedList做removeFirst()操作,从链表的头部获取连接,便可以访问数据库,当程序关闭数据库,做close()操作时,就会对LinkedList做addLast()操作,将连接插回链表的尾部,将Connection归还给池,池就可以再次利用这个Connection对象了,
这里,我们常用的数据库连接池有两种,c3p0和dbcp
c3p0
jar包
使用c3p0的话,jar包是必不可少的了,可以去[http://mvnrepository.com/]这里下载需要的jar包,什么都有哦!请注意:如果你下载的jar包是c3p0-0.9.1-pre1.jar包的话,是可以不用mchange-commonsjar包的哦!
这个包也是必不可少的哦!否则是找不到连接驱动的
c3p0配置
首先,列出我的项目结构
在配置文件c3p0-config.xml中除了最基本的连接驱动driverClass,还有数据库路径jdbcUrl,用户名user,密码password之外,还可以设置连接池的初始容量,最大连接数,最小连接数等。
<?xml version="1.0" encoding="utf-8" ?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/product_again?characterEncoding=utf8</property>
<property name="user">root</property>
<property name="password"></property>
<property name="initialPoolSize">30</property>
<property name="maxPoolSize">10</property>
<property name="minPoolSize">5</property>
</default-config>
</c3p0-config>
也可以搜索ComboPooledDataSource.class,里面有更为详细的配置选项
c3p0工具类
package c3p0;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class C3P0Util {
//获取数据源
static DataSource ds= new ComboPooledDataSource();
//获取连接
public static Connection getConnection(){
try {
return ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
Connection connection=getConnection();
System.out.println(connection);
}
//释放资源
public static void close(Connection conn, ResultSet rs, PreparedStatement ps){
if (conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (ps!=null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
c3p0数据操作类
package c3p0;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class C3P0Dao {
public static int update(String sql){
try {
Connection conn=C3P0Util.getConnection();
PreparedStatement ps=conn.prepareStatement(sql);
int n=ps.executeUpdate();
C3P0Util.close(conn,null,ps);
return n;
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
public static List<Map<String,Object>> query(String sql){
List<Map<String,Object>> list=null;
Connection conn=C3P0Util.getConnection();
try {
PreparedStatement ps=conn.prepareStatement(sql);
ResultSet rs=ps.executeQuery();
list=resultSetToList(rs);
C3P0Util.close(conn,rs,ps);
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
public static List<Map<String,Object>> resultSetToList(ResultSet rs){
List<Map<String,Object>> list=new ArrayList<>();
try {
ResultSetMetaData metaData=rs.getMetaData();
ArrayList<String> cnames=new ArrayList<>();
Map<String,Object> map=null;
for (int i = 1; i <=metaData.getColumnCount() ; i++) {
cnames.add(metaData.getColumnName(i));
}
System.out.println("所有的列"+cnames);
while (rs.next()){
map=new HashMap<>();
for (String cname:cnames){
map.put(cname,rs.getObject(cname));
}
list.add(map);
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
}
测试类
package c3p0;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class C3P0Text {
public static void main(String[] args) {
String sql="select *from classify";
List<Map<String,Object>> list=C3P0Dao.query(sql);
for (Map<String,Object> map:list) {
for (Map.Entry<String,Object> es:map.entrySet()) {
System.out.print(es.getKey()+" "+es.getValue()+" ");
}
System.out.println();
}
}
}
今天就先到这里了,下次再放出dbcp的用法!