天天看点

数据库连接池的理解和使用

一、什么是数据库连接池?

官方:​​数据库​​连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。

个人理解:创建数据库连接是一个很耗时的操作,也容易对数据库造成安全隐患。所以,在程序初始化的时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,可以保证较快的数据库读写速度,还更加安全可靠。

二、数据库连接池的运行机制

(1)

 程序初始化时创建连接池

(2)

使用时向连接池申请可用连接

(3)

使用完毕,将连接返还给连接池

(4)

程序退出时,断开所有连接,并释放资源

数据库连接池的理解和使用

三、数据库连接池的使用

作为开源的数据库连接池,C3P0是一个优秀的连接池,性能也十分可靠。

首先到​​http://sourceforge.net/projects/c3p0/​​下载相应的jar包,总共三个,如下图所示。

数据库连接池的理解和使用

其次将jar包导入到工程当中,然后就可以使用cp30了。

示例代码如下:

[java]  ​​view plain​​  ​​copy​​

  1. package com.zww.server;  
  2. import java.beans.PropertyVetoException;  
  3. import java.sql.Connection;  
  4. import java.sql.SQLException;  
  5. import com.mchange.v2.c3p0.ComboPooledDataSource;  
  6. public final class ConnectionManager {  
  7. //使用单利模式创建数据库连接池  
  8. private static ConnectionManager instance;  
  9. private static ComboPooledDataSource dataSource;  
  10. private ConnectionManager() throws SQLException, PropertyVetoException {  
  11. new ComboPooledDataSource();  
  12. "root");     //用户名  
  13. "123456"); //密码  
  14. "jdbc:mysql://127.0.0.1:3306/zww");//数据库地址  
  15. "com.mysql.jdbc.Driver");  
  16. 5); //初始化连接数  
  17. 1);//最小连接数  
  18. 10);//最大连接数  
  19. 50);//最长等待时间  
  20. 60);//最大空闲时间,单位毫秒  
  21.     }  
  22. public static final ConnectionManager getInstance() {  
  23. if (instance == null) {  
  24. try {  
  25. new ConnectionManager();  
  26. catch (Exception e) {  
  27.                 e.printStackTrace();  
  28.             }  
  29.         }  
  30. return instance;  
  31.     }  
  32. public synchronized final Connection getConnection() {  
  33. null;  
  34. try {  
  35.             conn = dataSource.getConnection();  
  36. catch (SQLException e) {  
  37.             e.printStackTrace();  
  38.         }  
  39. return conn;  
  40.     }  
  41. }  

[java]  ​​view plain​​  ​​copy​​

  1. package com.zww.server;  
  2. import java.sql.Connection;  
  3. import java.sql.PreparedStatement;  
  4. import java.sql.ResultSet;  
  5. import java.sql.SQLException;  
  6. import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;  
  7. public class ConnectionDemo {  
  8. public static void main(String[] args) throws SQLException {  
  9. "使用连接池................................");  
  10. for (int i = 0; i < 20; i++) {  
  11. long beginTime = System.currentTimeMillis();  
  12.             Connection conn = ConnectionManager.getInstance().getConnection();  
  13. try {  
  14. "select * from event");  
  15.                 ResultSet rs = pstmt.executeQuery();  
  16. while (rs.next()) {  
  17. // do nothing...  
  18.                 }  
  19. catch (SQLException e) {  
  20.                 e.printStackTrace();  
  21. finally {  
  22. try {  
  23.                     conn.close();  
  24. catch (SQLException e) {  
  25.                     e.printStackTrace();  
  26.                 }  
  27.             }  
  28. long endTime = System.currentTimeMillis();  
  29. "第" + (i + 1) + "次执行花费时间为:" + (endTime - beginTime));  
  30.         }  
  31. "不使用连接池................................");  
  32. for (int i = 0; i < 20; i++) {  
  33. long beginTime = System.currentTimeMillis();  
  34. new MysqlDataSource();  
  35. "jdbc:mysql://localhost:3306/zww");  
  36. "root");  
  37. "123456");  
  38.             Connection conn = mds.getConnection();  
  39. try {  
  40. "select * from event");  
  41.                 ResultSet rs = pstmt.executeQuery();  
  42. while (rs.next()) {  
  43. // do nothing...  
  44.                 }  
  45. catch (SQLException e) {  
  46.                 e.printStackTrace();  
  47. finally {  
  48. try {  
  49.                     conn.close();  
  50. catch (SQLException e) {  
  51.                     e.printStackTrace();  
  52.                 }  
  53.             }  
  54. long endTime = System.currentTimeMillis();  
  55. "第" + (i + 1) + "次执行花费时间为:"  
  56.                                 + (endTime - beginTime));  
  57.         }  
  58.     }  

运行结果如下图所示:

数据库连接池的理解和使用
数据库连接池的理解和使用

​​测试​​结果表明,在使用连接池时,只在第一次初始化时,比较耗时,完成初始化之后,使用连接池进行数据库操作明显比不使用连接池花费的时间少。

二、数据库连接池的运行机制

(1)  程序初始化时创建连接池

(2) 使用时向连接池申请可用连接

(3) 使用完毕,将连接返还给连接池

(4) 程序退出时,断开所有连接,并释放资源

数据库连接池的理解和使用

三、数据库连接池的使用

作为开源的数据库连接池,C3P0是一个优秀的连接池,性能也十分可靠。

首先到​​http://sourceforge.net/projects/c3p0/​​下载相应的jar包,总共三个,如下图所示。

数据库连接池的理解和使用

其次将jar包导入到工程当中,然后就可以使用cp30了。

示例代码如下:

[java]  ​​view plain​​  ​​copy​​

  1. package com.zww.server;  
  2. import java.beans.PropertyVetoException;  
  3. import java.sql.Connection;  
  4. import java.sql.SQLException;  
  5. import com.mchange.v2.c3p0.ComboPooledDataSource;  
  6. public final class ConnectionManager {  
  7. //使用单利模式创建数据库连接池  
  8. private static ConnectionManager instance;  
  9. private static ComboPooledDataSource dataSource;  
  10. private ConnectionManager() throws SQLException, PropertyVetoException {  
  11. new ComboPooledDataSource();  
  12. "root");     //用户名  
  13. "123456"); //密码  
  14. "jdbc:mysql://127.0.0.1:3306/zww");//数据库地址  
  15. "com.mysql.jdbc.Driver");  
  16. 5); //初始化连接数  
  17. 1);//最小连接数  
  18. 10);//最大连接数  
  19. 50);//最长等待时间  
  20. 60);//最大空闲时间,单位毫秒  
  21.     }  
  22. public static final ConnectionManager getInstance() {  
  23. if (instance == null) {  
  24. try {  
  25. new ConnectionManager();  
  26. catch (Exception e) {  
  27.                 e.printStackTrace();  
  28.             }  
  29.         }  
  30. return instance;  
  31.     }  
  32. public synchronized final Connection getConnection() {  
  33. null;  
  34. try {  
  35.             conn = dataSource.getConnection();  
  36. catch (SQLException e) {  
  37.             e.printStackTrace();  
  38.         }  
  39. return conn;  
  40.     }  
  41. }  

[java]  ​​view plain​​  ​​copy​​

  1. package com.zww.server;  
  2. import java.sql.Connection;  
  3. import java.sql.PreparedStatement;  
  4. import java.sql.ResultSet;  
  5. import java.sql.SQLException;  
  6. import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;  
  7. public class ConnectionDemo {  
  8. public static void main(String[] args) throws SQLException {  
  9. "使用连接池................................");  
  10. for (int i = 0; i < 20; i++) {  
  11. long beginTime = System.currentTimeMillis();  
  12.             Connection conn = ConnectionManager.getInstance().getConnection();  
  13. try {  
  14. "select * from event");  
  15.                 ResultSet rs = pstmt.executeQuery();  
  16. while (rs.next()) {  
  17. // do nothing...  
  18.                 }  
  19. catch (SQLException e) {  
  20.                 e.printStackTrace();  
  21. finally {  
  22. try {  
  23.                     conn.close();  
  24. catch (SQLException e) {  
  25.                     e.printStackTrace();  
  26.                 }  
  27.             }  
  28. long endTime = System.currentTimeMillis();  
  29. "第" + (i + 1) + "次执行花费时间为:" + (endTime - beginTime));  
  30.         }  
  31. "不使用连接池................................");  
  32. for (int i = 0; i < 20; i++) {  
  33. long beginTime = System.currentTimeMillis();  
  34. new MysqlDataSource();  
  35. "jdbc:mysql://localhost:3306/zww");  
  36. "root");  
  37. "123456");  
  38.             Connection conn = mds.getConnection();  
  39. try {  
  40. "select * from event");  
  41.                 ResultSet rs = pstmt.executeQuery();  
  42. while (rs.next()) {  
  43. // do nothing...  
  44.                 }  
  45. catch (SQLException e) {  
  46.                 e.printStackTrace();  
  47. finally {  
  48. try {  
  49.                     conn.close();  
  50. catch (SQLException e) {  
  51.                     e.printStackTrace();  
  52.                 }  
  53.             }  
  54. long endTime = System.currentTimeMillis();  
  55. "第" + (i + 1) + "次执行花费时间为:"  
  56.                                 + (endTime - beginTime));  
  57.         }  
  58.     }  

运行结果如下图所示:

数据库连接池的理解和使用
数据库连接池的理解和使用