Java-自定义简单的mysql数据库连接池

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java-自定义简单的mysql数据库连接池相关的知识,希望对你有一定的参考价值。

    当我们在使用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 }

 

  




以上是关于Java-自定义简单的mysql数据库连接池的主要内容,如果未能解决你的问题,请参考以下文章

自定义简单的MySQL连接池

JDBC自定义连接池

JAVA自定义连接池原理设计

java数据库连接池的介绍与定义一个简单的连接池

MySQL自定义数据库连接池和开源数据库连接池的使用

MySql数据库再学习——使用强化版的自定义连接池连接数据库