数据库连接池DBCP和C3P0
来源:互联网 发布:克伦威尔 知乎 编辑:程序博客网 时间:2024/05/22 07:51
连接池
实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况我们采用连接池技术,来共享连接Connection。这样我们就不需要每次
都创建连接、释放连接了,这些操作都交给了连接池。
概念
用池来管理Connection,这样可以重复使用Connection。有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。
规范
Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池!
常见的连接池:DBCP、C3P0。
DBCP也是一个开源的连接池,是Apache Common成员之一,使用时同样在项目中导入jar包,即:commons-dbcp-1.4.jar和commons-pool-1.5.6.jar。
编写工具类
连接数据库表的工具类,采用DBCP连接池的方式来完成,Java中提供了一个连接池的规则接口:DataSource,在使用DBCP连接池方式时由commons-dbcp-1.4.jar包中定义了
DataSource接口实现类称为BasicDataSourceFactory类。
通过properties配置文件和JBDC工具类方便以后维护使用。
代码实例:
database.properties配置文件
driverClass=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/mydatabaseusername=rootpassword=12345678initialSize=10maxActive=50MaxIdle=20MinIdle=10
工具类JBDCUtils.java:
import java.io.IOException;import java.io.InputStream;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Properties;import javax.sql.DataSource;import org.apache.commons.dbcp.BasicDataSourceFactory;//此类是JDBC工具类,包括获取连接和释放资源的方法//可以结合properties配置文件使用public class JBDCUtils {private static String driverClass;private static String url;private static String username;private static String password;private static Connection con;private static DataSource dataSource;//静态代码块加载配置文件信息static{try{//通过类加载器获得一个输入流,将配置文件中的数据读取进来InputStream in = JBDCUtils.class.getClassLoader().getResourceAsStream("database.properties");//以键值对的形式存放在Properties的对象中Properties pro = new Properties();pro.load(in);dataSource = BasicDataSourceFactory.createDataSource(pro);}catch(Exception e){e.printStackTrace();}}//获取连接方法public static Connection getConnection(){try{return dataSource.getConnection();}catch(Exception e){e.printStackTrace();}return con;}//释放资源方法public static void close(Connection con,Statement stat , ResultSet rs){if(rs!=null){ try{ rs.close(); }catch(SQLException ex){ ex.printStackTrace(); } } if(stat!=null){ try{ stat.close(); }catch(SQLException ex){ ex.printStackTrace(); } } if(con!=null){ try{ con.close(); }catch(SQLException ex){ ex.printStackTrace(); } } }public static DataSource getDataSource(){return dataSource;}}
测试类:
import java.sql.Connection;import java.sql.ResultSet;import java.sql.Statement;public class JDBCtest {public static void main(String[] args){String sql = "select * from sort";Connection con = null;try{con = JBDCUtils.getConnection();Statement stat = con.createStatement();ResultSet rs = stat.executeQuery(sql);while(rs.next()){System.out.println(rs.getInt("sid")+" "+rs.getString("sname")+" "+rs.getDouble("sprice")+" "+rs.getString("sdesc"));}JBDCUtils.close(con,stat,rs); }catch(Exception e){e.printStackTrace();}}}
使用时首先导入jar包c3p0-0.9.2-pre5.jar和mchange-commons-java-0.2.3jar.再添加配置文件c3p0-config.xml。(非常常用)
c3p0-config.xml
<?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/mydatabase</property><property name="user">root</property><property name="password">12345678</property><property name="initialPoolSize">5</property><property name="maxPoolSize">20</property> </default-config> <named-config name="oracle"> <property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/mydatabase</property><property name="user">root</property><property name="password">12345678</property> </named-config> </c3p0-config>
测试类:c3p0test1.java
import java.sql.Connection;import java.sql.ResultSet;import java.sql.Statement;import com.mchange.v2.c3p0.ComboPooledDataSource;public class c3p0test1 {//使用默认配置,如果要使用连接池,必须创建该类的实例对象private static ComboPooledDataSource dataSource = new ComboPooledDataSource();//调用该类中重写的getConnnection()方法public static void main(String[] args) throws Exception{Connection con = dataSource.getConnection();String sql = "select * from sort";Statement stat = con.createStatement();ResultSet rs = stat.executeQuery(sql);while(rs.next()){System.out.println(rs.getInt("sid")+" "+rs.getString("sname")+" "+rs.getDouble("sprice")+" "+rs.getString("sdesc"));}rs.close();stat.close();con.close();}}
- 数据库连接池c3p0和dbcp
- 数据库连接池DBCP和C3P0
- 数据库连接池c3p0和dbcp
- 数据库连接池DBCP和C3P0
- 数据库连接池c3p0和dbcp
- 数据库连接池c3p0和dbcp
- 数据库连接池 DBCP和c3p0数据库连接池
- 数据库连接池c3p0/dbcp
- 数据库连接池——dbcp和c3p0
- 数据库连接池以及C3P0和DBCP
- 数据库连接池:Dbcp和C3p0学习
- C3P0和DBCP数据库连接池的
- 数据库连接池c3p0和dbcp和tomcat-dbcp
- dbcp、c3p0 数据库连接池解释
- DBCP与C3P0数据库连接池
- JDBC 数据库连接池 -Dbcp -C3p0
- 数据库连接池(DBCP C3P0)
- Java框架数据库连接池比较(c3p0,dbcp和proxool)
- 使用epoll模型
- C语言基础之循环
- CSU 1565Word Cloud
- 【dfs+奇偶剪枝】HDU_1010_Tempter of the Bone
- ASP.NET数据库操作类——打包
- 数据库连接池DBCP和C3P0
- mysql必知必会
- NoSuchMethodError问题记录
- 二叉树中和为某一值的路径
- 从Quake 3源代码分析AI Bot库
- CSU 1566The Maze Makers
- 欧拉函数:HDU3501-Calculation 2
- Linux进程及相关定义
- hdu2577