当我们在使用java连接数据库的时候,要注册驱动,.再通过"驱动管理器"获取连接对象(Connection),当我们的程序被很多用户访问的时候,每次都创建一个Connection连接对 象的时候,程序会变得特别卡,这时候我们可以通过数据库连接池来解决这个问题。
用连接池来管理Connection,这可以重复使用Connection。有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调 用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。
常用的连接池:
1).DBCP连接池:Apache公司的免费、开源的连接池实现。Apache公司的Tomcat服务器内部就是采用的DBCP连接池。
2).C3P0连接池:免费、开源的。在长时间运行的情况下,C3P0内部的资源释放方面的功能要比DBCP要强大。世界主流框架:Spring框架、Hibernate框架内部
采用的就是C3P0连接池。
按照这个原理,我自己写了一个简易的数据库连接池,考虑的不是很周全,仅供参考,有兴趣的朋友可以定义一个逻辑更加严谨的连接池。
首先写一个配置文件,将连接数据库的信息写入配置文件:
1 driverClassName=com.mysql.jdbc.Driver 2 url=jdbc:mysql://localhost:3306/student 3 username=root 4 password=123456
自定义数据库连接池代码:
1 package connectionpool; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.SQLException; 6 import java.util.LinkedList; 7 import java.util.Properties; 8 9 import javax.sql.DataSource; 10 11 //创建一个自定义数据库连接池; 12 public class JDBCPool{ 13 //通过LinkedList集合来存储Connection对象,用来模拟onnection对象的重复利用过程; 14 //初始化connection对象的个数; 15 //定义最大的连接对象; 16 //定义连接池最少需要留取的对象 17 private static LinkedList<Connection> link; 18 private static Properties p; 19 private static int initCount=5; 20 private static int maxCount=10; 21 private static int minCount=1; 22 //通过静态代码块来实现注册驱动; 23 static{ 24 p= new Properties(); 25 try { 26 p.load(JDBCPool.class.getClassLoader().getResourceAsStream("dpconfig.properties")); 27 Class.forName(p.getProperty("driverClassName")); 28 link = new LinkedList<Connection>(); 29 } catch (Exception e) { 30 throw new RuntimeException(); 31 } 32 33 } 34 //通过构造方法来实现初始化的Connection对象的个数; 35 //我这里是初始化的Connection对象是5个; 36 public JDBCPool(){ 37 for (int i = 0; i <initCount; i++) { 38 try { 39 this.link.addFirst(this.createConnection()); 40 } catch (SQLException e) { 41 42 e.printStackTrace(); 43 } 44 } 45 } 46 //创建Connection对象的方法,如果大于最小的创建好的Connection对象,就直接取出去; 47 //如果没有的话,就判断是否到达最大的连接数,没到达的话,就创建一个; 48 //我没有对不满足两种情况进行处理,有兴趣的朋友可以尝试一下; 49 private Connection getConnetion(){ 50 synchronized(link){if(link.size()>minCount){ 51 return link.removeFirst(); 52 }if(link.size()<maxCount){ 53 try { 54 return this.createConnection(); 55 } catch (SQLException e) { 56 57 e.printStackTrace(); 58 } 59 } 60 return null; 61 } 62 } 63 //用来创建Connection对象的 64 public Connection createConnection() throws SQLException{ 65 return DriverManager.getConnection(p.getProperty("url"),p.getProperty("username"),p.getProperty("password")); 66 } 67 //回收时是将Connection取回到集合,并不是关闭 68 public void free(Connection conn){ 69 this.link.addLast(conn); 70 } 71 }
时间: 2024-12-25 03:48:29