1.连接池技术的引出
上面我已经阐述了将JDBC封装成了很好用的工具类,其实对于个人封装性已经是很好的了,但是通常我么应该考虑到我们每次在执行一条SQL句时,都要对数据库进行连接,与关闭,这极大的消耗了数据库的资源,为了解决这个问题,提出了连接池技术。这里我想说一下,以我目前学到的知识来看,每次出现池这个概念的时候一定是要提高系统效率的,比如说线程池。
连接池技术就是系统在开始的时候先主动地建立若干个连接,当有用户要进行SQL操作的时候,系统会分配给当前用户一个连接,用户在使用这个连接完毕后,不必关闭这个连接,而是将这个连接归还给连接池,那么当有大量用户同时需要对数据库进行操作而导致连接数量不够分配的时候,没有分配到连接的用户需要等待,等到其他用户归还后,在分配给这个用户,这样的设计方式极大的提高了系统的运行效率。
2.连接池的具体代码
这里我首先要说的是在eclipse要想使用连接池,首先要导入相应池的jar包,然后我们要对之前的连接配置文件做一个简单的修改如下所示:
jdbc.driverclass=oracle.jdbc.driver.OracleDriver jdbc.url=jdbc:oracle:thin:localhost:orcl jdbc.user=system jdbc.password=123 #dbcp param dbcp.maxActive=1 dbcp.initSize=1
可以看到就是在之前的文件之中加入了两句话,设置连接的初始和最大连接数,这里数量不要设置过大,否则会造成数据库瘫痪。
整体代码如下:
1 package jbbc_day01; 2 3 import java.io.IOException; 4 import java.sql.Connection; 5 import java.sql.SQLException; 6 import java.util.Properties; 7 8 import org.apache.commons.dbcp.BasicDataSource; 9 10 /** 11 * 用来管理连接 12 * 数据库连接信息,保存在属性文件中 13 * @author jiawenzhe 14 * 15 */ 16 public class DBUtil3 { 17 private static BasicDataSource ds; 18 //1、加载驱动 19 static{ 20 try { 21 //加载属性文件数据 22 Properties prop = new Properties(); 23 prop.load 24 (DBUtil3.class.getClassLoader(). 25 getResourceAsStream 26 ("db.properties")); 27 String driverclass = prop.getProperty("jdbc.driverclass"); 28 String url = prop.getProperty("jdbc.url"); 29 String user = prop.getProperty("jdbc.user"); 30 String password = prop.getProperty("jdbc.password"); 31 String strMaxActive 32 = prop.getProperty("dbcp.maxActive"); 33 String strInitSize 34 = prop.getProperty("dbcp.initSize"); 35 //实例化,并初始化连接池 36 ds = new BasicDataSource(); 37 ds.setDriverClassName(driverclass); 38 ds.setUrl(url); 39 ds.setUsername(user); 40 ds.setPassword(password); 41 ds.setMaxActive 42 (Integer.parseInt(strMaxActive)); 43 ds.setInitialSize 44 (Integer.parseInt(strInitSize)); 45 46 } catch (IOException e) { 47 e.printStackTrace(); 48 throw new RuntimeException 49 ("读取属性文件错误",e); 50 } 51 } 52 //2、创建连接 53 public static Connection getConnection() throws SQLException{ 54 return ds.getConnection() ; 55 } 56 57 //3、关闭连接 58 public static void close(Connection conn){ 59 if(conn!=null){ 60 try { 61 conn.close(); 62 } catch (SQLException e) { 63 e.printStackTrace(); 64 throw new RuntimeException("关闭连接错误",e); 65 } 66 } 67 } 68 }
这里面同样是调用了close()方法,但是我们不能像之前那样理解为关闭连接,而我们应该认为他是归还给连接池,用Properties类读取出来的初始化和最大连接数量是字符串类型,而需要将字符串类型转换为Integer类型。
这里需要在介绍一个新类:BasicDataSource();
在我看来这个类再一次的优化了连接的封装
在实例化这个类之后,他有一系列的set属性方法,就是将Properties类get得到的值放入其中去统一初始化连接的准备工作,而不用想工具类2中那样放入到对应的方法中,而且这个类实现的对象直接就可以调用getConnection对象返回一个连接。
这样最终版本的JDBC工具类就写好了,我们再进行JDBC操作的时候可以直接拿来使用这个工具类,而之前所述的那两个工具类,都是为了最终引出这个工具类而做的前提铺垫
所以只需要记住这个工具类即可!
未完待续!