三个目前比较常见的连接池的简单运用
c3p0:
目前在市面上c3p0可以说已经占据了连接池的大头,很多的框架都在使用c3p0来作为连接数据库的一个连接池。
那么我们如何使用c3p0来获取连接呢,
c3p0给我们提供了三种方式
1、通过setXXX()的方式来设置属性,很简单,但这样的话难免有着硬编码的问题(spring框架可以在spring配置文件中通过依赖注入的方式来设置属性)
2、通过properties属性文件来进行配置,这种就是直接创建一个c3p0.properties文件并设置相应属性就可以了,c3p0可以进行自动解析(这样在修改连接属性时就需要修改源代码)
3、通过xml文件配置信息, 与第二点类似,另外说一下,xml配置文件似乎用的更多。
详情可以参照http:// blog.csdn.net/u012506661/article/details/53548083,写得就非常详细
那么我们接下来就附上第一种方式的代码 ,这是最简单的使用,不需要配置就可以了,同我上一次发的文章一样,我也已经把他封装到一个DBUtil工具类中了,
步骤1.
导入jar包
步骤2、实例化一个ComboPooledDataSource对象,并设置属性(我是自己创建一个properties文件进行配置)
步骤3、调用getConnection()获取连接进行操作
1 package com.c3p0; 2 3 import java.beans.PropertyVetoException; 4 import java.sql.Connection; 5 import java.sql.DriverManager; 6 import java.sql.PreparedStatement; 7 import java.sql.ResultSet; 8 import java.sql.SQLException; 9 import java.util.ResourceBundle; 10 11 import com.mchange.v2.c3p0.ComboPooledDataSource; 12 13 14 public class DButil { 15 private static ComboPooledDataSource ds = null; 16 ResultSet rs = null; 17 Connection con=null; 18 PreparedStatement stmt=null; 19 static{ 20 ds = new ComboPooledDataSource(); 21 try { 22 ds.setDriverClass("com.mysql.jdbc.Driver"); 23 } catch (PropertyVetoException e) { 24 // TODO Auto-generated catch block 25 e.printStackTrace(); 26 } 27 ResourceBundle rb = ResourceBundle.getBundle("dbcp"); 28 ds.setJdbcUrl(rb.getString("url")); 29 ds.setUser(rb.getString("name")); 30 ds.setPassword(rb.getString("password")); 31 ds.setMaxPoolSize(Integer.parseInt(rb.getString("maxActive")));//设置最大连接数 32 ds.setMaxIdleTime(Integer.parseInt(rb.getString("maxWait")));//设置等待时间 33 ds.setInitialPoolSize(Integer.parseInt(rb.getString("maxIdle")));//设置最大空闲连接数 34 } 35 //用构造方法加载驱动 36 public DButil(){ 37 38 } 39 40 //创建链接符对象 41 public void conManager() 42 { 43 try { 44 con=ds.getConnection(); 45 } catch (SQLException e) { 46 // TODO Auto-generated catch block 47 e.printStackTrace(); 48 } 49 } 50 //创建方法用于关闭数据库 51 public void closeFunction(ResultSet rs){ 52 try{ 53 //如果三个值不为空 就关闭 54 if(rs!=null){ 55 rs.close(); 56 } 57 if(con!=null){ 58 ds.close(); 59 } 60 if(stmt!=null){ 61 stmt.close(); 62 } 63 }catch(Exception e){ 64 e.printStackTrace(); 65 } 66 } 67 /** 68 * 封装工具类的方法(用于增删改) 69 * @param sql 70 * @return 71 */ 72 public int execUpdate(String sql,Object[] o){ 73 int result=0; 74 //创建Conn类型的变量 75 try{ 76 conManager(); 77 //创建数据库操作对象 78 79 stmt=con.prepareStatement(sql); 80 if(o!=null){ 81 for(int i=0;i<o.length;i++){ 82 stmt.setObject(i+1, o[i]); 83 } 84 } 85 //用result保存数据库执行 86 result=stmt.executeUpdate(); 87 }catch(Exception e){ 88 e.printStackTrace(); 89 } 90 finally{ 91 closeFunction(null); 92 } 93 94 95 return result; 96 } 97 /** 98 * 封装工具类用于查询 99 */ 100 public ResultSet connectionSelect(String sql,Object[] o){ 101 try{ 102 //写入驱动 103 conManager(); 104 //创建数据库操作对象 105 stmt=con.prepareStatement(sql); 106 if(o!=null){ 107 for(int i=0;i<o.length;i++){ 108 stmt.setObject(i+1, o[i]); 109 } 110 } 111 //用rs保存数据库执行 112 rs=stmt.executeQuery(); 113 114 115 }catch(Exception e){ 116 e.printStackTrace(); 117 } 118 return rs; 119 } 120 }
package com.c3p0; import java.sql.ResultSet; import org.junit.Test; public class Demo { @Test public void run() throws Exception{ DButil db = new DButil(); ResultSet rs = db.connectionSelect("select * from SECURITY",null); while(rs.next()){ System.out.println(rs.getString(1)+" "+rs.getString(2)); } } }
DBCP的使用
同样有三步
1、导入架包
2、实例 化 一个BasicDataSource类,设置属性
3、获取连接进行操作
1 @Test 2 public void demo() throws Exception{ 3 //创建读取文件的资源对象 4 ResourceBundle rb = ResourceBundle.getBundle("dbcp"); 5 //创建基础数据源 6 BasicDataSource bds = new BasicDataSource(); 7 //设置参数 8 bds.setMaxActive(Integer.parseInt(rb.getString("maxActive"))); 9 bds.setMaxIdle(Integer.parseInt(rb.getString("maxIdle"))); 10 bds.setMaxWait(Integer.parseInt(rb.getString("maxWait"))); 11 bds.setUsername(rb.getString("name")); 12 bds.setPassword(rb.getString("password")); 13 bds.setDriverClassName(rb.getString("driverClassName")); 14 bds.setUrl(rb.getString("url")); 15 16 Connection conn = bds.getConnection(); 17 PreparedStatement pst = conn.prepareStatement("select * from SECURITY"); 18 //执行sql 19 ResultSet rs = pst.executeQuery(); 20 //遍历 21 while(rs.next()){ 22 System.out.println(rs.getObject(1)+" "+rs.getObject(2)); 23 } 24 rs.close(); 25 pst.close(); 26 conn.close(); 27 }
值得说下的是,druid这款连接池,目前据说是比以往任何一款连接池的性能都要强,也许过不了多久,连接池的市场可能druid要独占鳌头了,所以这个比较重要
druid本身也支持三种配置连接属性的方式 ,
即 set方法设置 、properties文件配置、还有xml配置文件这三种,由于这里只是做一个简单的使用,所以我使用了第一种方式
步骤如下
1、导入jar包
2、实例化DruidDataSource,并通过set方法设置属性
3、获取连接
4、进行操作,
5、直接调用连接的close就可以归还连接了
工具类的代码
public class DButil { private static DruidDataSource ds = null; ResultSet rs = null; Connection con=null; PreparedStatement stmt=null; static{ //读取配置文件信息 ResourceBundle rb = ResourceBundle.getBundle("dbcp"); ds = new DruidDataSource(); //设置ds连接池的参数 ds.setDriverClassName(rb.getString("url")); ds.setUsername(rb.getString("name")); ds.setPassword(rb.getString("password")); ds.setUrl(rb.getString("url")); ds.setInitialSize(Integer.parseInt(rb.getString("maxActive"))); ds.setMinIdle(Integer.parseInt(rb.getString("maxWait"))); ds.setMaxActive(Integer.parseInt(rb.getString("maxIdle"))); } //用构造方法加载驱动 public DButil(){ } //创建链接符对象 public void conManager() { try { con=ds.getConnection(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //创建方法用于关闭数据库 public void closeFunction(ResultSet rs){ try{ //如果三个值不为空 就关闭 if(rs!=null){ rs.close(); } if(con!=null){ con.close(); } if(stmt!=null){ stmt.close(); } }catch(Exception e){ e.printStackTrace(); } } /** * 封装工具类的方法(用于增删改) * @param sql * @return */ public int execUpdate(String sql,Object[] o){ int result=0; //创建Conn类型的变量 try{ conManager(); //创建数据库操作对象 stmt=con.prepareStatement(sql); if(o!=null){ for(int i=0;i<o.length;i++){ stmt.setObject(i+1, o[i]); } } //用result保存数据库执行 result=stmt.executeUpdate(); }catch(Exception e){ e.printStackTrace(); } finally{ closeFunction(null); } return result; } /** * 封装工具类用于查询 */ public ResultSet connectionSelect(String sql,Object[] o){ try{ //写入驱动 conManager(); //创建数据库操作对象 stmt=con.prepareStatement(sql); if(o!=null){ for(int i=0;i<o.length;i++){ stmt.setObject(i+1, o[i]); } } //用rs保存数据库执行 rs=stmt.executeQuery(); }catch(Exception e){ e.printStackTrace(); } return rs; } }
测试的代码
@Test public void run() throws Exception{ DButil db = new DButil(); ResultSet rs = db.connectionSelect("select * from user",null); while(rs.next()){ System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3)+" "); } }
总结一下,如昨天说的一样,这三个连接池都要求要实例化一个实现了DataSource接口的实现类进行操作,同时他们对connection即获取的连接的close方法进行了增强,以达到关闭连接时
不是关闭与数据库的连接而是归还到连接池中,说得不是很详细,还需要多多学习
详细可看http://www.cnblogs.com/hafiz/p/5879356.html
分享一个文章,写得很可以,比我的详细很多
http://www.cnblogs.com/shellway/p/3938554.html