1. 数据库连接实际上是客户端和远程数据库服务器建立了一个socket连接, 创建过程比较耗性能和时间, 因此出现了数据库连接池技术。

2. 数据库连接池负责分配、管理和释放数据库连接, 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。这项技术能明显提高对数据库操作的性能。

3. 连接池基本的思想是在系统初始化的时候, 将数据库连接作为对象存储在内存中, 当用户需要访问数据库时, 并非建立一个新的连接, 而是从连接池中取出一个已建立的空闲连接对象。使用完毕后, 用户也并非将连接关闭, 而是将连接放回连接池中, 以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时, 还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。

4. 在Java中常用的开源的数据库连接池有以下几种

4.1. C3P0: 是一个开放源代码的JDBC连接池, 包括了实现jdbc3和jdbc2扩展规范说明的Connection和Statement池的DataSources 对象。

4.2. Proxool: 是一个Java SQL Driver驱动程序, 提供了对选择的其它类型的驱动程序的连接池封装。可以非常简单的移植到现存的代码中, 完全可配置, 快速、成熟、健壮。可以透明地为现存的JDBC驱动程序增加连接池功能。

4.3. Jakarta DBCP: DBCP是一个依赖Jakartacommons-pool对象池机制的数据库连接池。DBCP可以直接的在应用程序中使用。

4.4. 目前Proxool和DBCP以及C3P0一起, 最为常见的三种JDBC连接池技术。

4.5. 后来, Hibernate官方宣布由于Bug太多不再支持DBCP, 而推荐使用C3P0或Proxool。

5. 自己实现Java的数据库连接池接口(DataSource)

5.1. 创建一个名称为SunDataSource的Java工程, 使用之前的JDBCUtil.java和jdbc.properties属性文件

5.2. 创建一个MyDataSource.java实现Java的DataSource接口

package com.lywgames.myjdbc;import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import javax.sql.DataSource;
import com.lywgames.util.JDBCUtil;/*** 实现java的DataSource接口*/
public class MyDataSource implements DataSource {private List<Connection> list = new ArrayList<Connection>();/*** 对象一创建就创建10个数据库连接对象, 放到list对象*/public MyDataSource() {for (int i = 0; i < 10; i++) {Connection conn = JDBCUtil.getConn();list.add(conn);}}// 该连接池对外公布的获取连接的方法@Overridepublic Connection getConnection() throws SQLException {// 发现连接池的连接数量为0, 自动扩容if(list.size() == 0) {for (int i = 0; i < 10; i++) {Connection conn = JDBCUtil.getConn();list.add(conn);}}return list.remove(0);}/*** 归还数据库连接对象* @param conn*/public void backConnection(Connection conn) {System.out.println("归还连接前, 连接数:" + list.size());list.add(conn);System.out.println("归还连接后, 连接数:" + list.size());}@Overridepublic Connection getConnection(String username, String password) throws SQLException {return null;}@Overridepublic PrintWriter getLogWriter() throws SQLException {return null;}@Overridepublic int getLoginTimeout() throws SQLException {return 0;}@Overridepublic Logger getParentLogger() throws SQLFeatureNotSupportedException {return null;}@Overridepublic void setLogWriter(PrintWriter arg0) throws SQLException {}@Overridepublic void setLoginTimeout(int arg0) throws SQLException {}@Overridepublic boolean isWrapperFor(Class<?> arg0) throws SQLException {return false;}@Overridepublic <T> T unwrap(Class<T> arg0) throws SQLException {return null;}}

5.3. 使用MyDataSource

package com.lywgames.myjdbc;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Timestamp;
import com.lywgames.util.JDBCUtil;public class MyJDBC {public static void main(String[] args) {Connection conn = null;PreparedStatement ps = null;// 创建自己的连接池对象MyDataSource ds = new MyDataSource();try {conn = ds.getConnection();ps = conn.prepareStatement("insert into user values(null,?,?,?)");ps.setString(1, "lvbu");ps.setString(2, "123456");ps.setTimestamp(3, new Timestamp(System.currentTimeMillis()));ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtil.release(ps);}// 归还连接ds.backConnection(conn);}
}

5.4. 运行程序, 查看结果

6. 对连接进行包装

6.1. 创建一个名称为MyDataSourceConnectionWrap的Java工程, 使用之前的JDBCUtil.java和jdbc.properties属性文件

6.2. 创建一个ConnectionWrap.java实现Connection接口

package com.lywgames.myjdbc;import java.sql.Array;
import java.sql.Blob;
import java.sql.CallableStatement;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.NClob;
import java.sql.PreparedStatement;
import java.sql.SQLClientInfoException;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.sql.SQLXML;
import java.sql.Savepoint;
import java.sql.Statement;
import java.sql.Struct;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.Executor;/*** 使用使用装饰者模式, 对JDBC实际创建的Connection对象进行包装*/
public class ConnectionWrap implements Connection {private List<Connection> list;private Connection connection;public ConnectionWrap(Connection connection, List<Connection> list) {this.connection = connection;this.list = list;}// 在Connection对象的close方法里归还数据库连接@Overridepublic void close() throws SQLException {System.out.println("调用close方法归还连接前: " + list.size());this.list.add(connection);System.out.println("调用close方法归还连接后: " + list.size());}@Overridepublic PreparedStatement prepareStatement(String sql) throws SQLException {return connection.prepareStatement(sql);}@Overridepublic PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException {return null;}@Overridepublic PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException {return null;}@Overridepublic PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException {return null;}@Overridepublic PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException {return null;}@Overridepublic PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency,int resultSetHoldability) throws SQLException {return null;}@Overridepublic boolean isWrapperFor(Class<?> arg0) throws SQLException {return false;}@Overridepublic <T> T unwrap(Class<T> arg0) throws SQLException {return null;}@Overridepublic void abort(Executor executor) throws SQLException {}@Overridepublic void clearWarnings() throws SQLException {}@Overridepublic void commit() throws SQLException {}@Overridepublic Array createArrayOf(String typeName, Object[] elements) throws SQLException {return null;}@Overridepublic Blob createBlob() throws SQLException {return null;}@Overridepublic Clob createClob() throws SQLException {return null;}@Overridepublic NClob createNClob() throws SQLException {return null;}@Overridepublic SQLXML createSQLXML() throws SQLException {return null;}@Overridepublic Statement createStatement() throws SQLException {return null;}@Overridepublic Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException {return null;}@Overridepublic Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {return null;}@Overridepublic Struct createStruct(String typeName, Object[] attributes) throws SQLException {return null;}@Overridepublic boolean getAutoCommit() throws SQLException {return false;}@Overridepublic String getCatalog() throws SQLException {return null;}@Overridepublic Properties getClientInfo() throws SQLException {return null;}@Overridepublic String getClientInfo(String name) throws SQLException {return null;}@Overridepublic int getHoldability() throws SQLException {return 0;}@Overridepublic DatabaseMetaData getMetaData() throws SQLException {return null;}@Overridepublic int getNetworkTimeout() throws SQLException {return 0;}@Overridepublic String getSchema() throws SQLException {return null;}@Overridepublic int getTransactionIsolation() throws SQLException {return 0;}@Overridepublic Map<String, Class<?>> getTypeMap() throws SQLException {return null;}@Overridepublic SQLWarning getWarnings() throws SQLException {return null;}@Overridepublic boolean isClosed() throws SQLException {return false;}@Overridepublic boolean isReadOnly() throws SQLException {return false;}@Overridepublic boolean isValid(int timeout) throws SQLException {return false;}@Overridepublic String nativeSQL(String sql) throws SQLException {return null;}@Overridepublic CallableStatement prepareCall(String sql) throws SQLException {return null;}@Overridepublic CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException {return null;}@Overridepublic CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency,int resultSetHoldability) throws SQLException {return null;}@Overridepublic void releaseSavepoint(Savepoint savepoint) throws SQLException {}@Overridepublic void rollback() throws SQLException {}@Overridepublic void rollback(Savepoint savepoint) throws SQLException {}@Overridepublic void setAutoCommit(boolean autoCommit) throws SQLException {}@Overridepublic void setCatalog(String catalog) throws SQLException {}@Overridepublic void setClientInfo(Properties properties) throws SQLClientInfoException {}@Overridepublic void setClientInfo(String name, String value) throws SQLClientInfoException {}@Overridepublic void setHoldability(int holdability) throws SQLException {}@Overridepublic void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException {}@Overridepublic void setReadOnly(boolean readOnly) throws SQLException {}@Overridepublic Savepoint setSavepoint() throws SQLException {return null;}@Overridepublic Savepoint setSavepoint(String name) throws SQLException {return null;}@Overridepublic void setSchema(String schema) throws SQLException {}@Overridepublic void setTransactionIsolation(int level) throws SQLException {}@Overridepublic void setTypeMap(Map<String, Class<?>> map) throws SQLException {}}

6.3. 创建一个MyDataSource.java实现DataSource接口

package com.lywgames.myjdbc;import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import javax.sql.DataSource;
import com.lywgames.util.JDBCUtil;/*** 实现java的DataSource接口*/
public class MyDataSource implements DataSource {private List<Connection> list = new ArrayList<Connection>();/*** 对象一创建就创建10个数据库连接对象, 放到list对象*/public MyDataSource() {for (int i = 0; i < 10; i++) {list.add(JDBCUtil.getConn());}}// 该连接池对外公布的获取连接的方法@Overridepublic Connection getConnection() throws SQLException {// 发现连接池的连接数量为0, 自动扩容if(list.size() == 0) {for (int i = 0; i < 10; i++) {list.add(JDBCUtil.getConn());}}// 对之前的Connection对象进行包装Connection connectionWrap = new ConnectionWrap(list.remove(0), list);return connectionWrap;}@Overridepublic Connection getConnection(String username, String password) throws SQLException {return null;}@Overridepublic PrintWriter getLogWriter() throws SQLException {return null;}@Overridepublic int getLoginTimeout() throws SQLException {return 0;}@Overridepublic Logger getParentLogger() throws SQLFeatureNotSupportedException {return null;}@Overridepublic void setLogWriter(PrintWriter arg0) throws SQLException {}@Overridepublic void setLoginTimeout(int arg0) throws SQLException {}@Overridepublic boolean isWrapperFor(Class<?> arg0) throws SQLException {return false;}@Overridepublic <T> T unwrap(Class<T> arg0) throws SQLException {return null;}}

6.4. 使用MyDataSource

package com.lywgames.myjdbc;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Timestamp;
import com.lywgames.util.JDBCUtil;public class MyJDBC {public static void main(String[] args) {Connection conn = null;PreparedStatement ps = null;// 创建自己的连接池对象MyDataSource ds = new MyDataSource();try {conn = ds.getConnection();ps = conn.prepareStatement("insert into user values(null,?,?,?)");ps.setString(1, "diaochan");ps.setString(2, "123456");ps.setTimestamp(3, new Timestamp(System.currentTimeMillis()));ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtil.release(conn, ps);}}
}

6.5. 运行程序, 查看结果

033_jdbc-mysql数据库连接池相关推荐

  1. Tomcat 5.5 配置 MySQL 数据库连接池

    用了最新的几个咚咚,搞了整整一天终于搞清楚了Tomcat 5.5 配置 MySQL 数据库连接池,网上的经验并不能完全用到新环境里面,我写出整个过程以方便大家配置. 1 环境描述 JDK 1.5 To ...

  2. python实现数据库连接池_Python实现Mysql数据库连接池

    Python实现Mysql数据库连接池 python连接Mysql数据库: python编程中可以使用MySQLdb进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接mysql数据库请求时,都 ...

  3. tomcat7.0.42如何设置mysql数据库连接池

    转载自   tomcat7.0.42如何设置mysql数据库连接池 如何在tomcat7.0.42中设置mysql数据库连接池????eclipse如何绑定tomcat??按网上教程总不成功!怎么办 ...

  4. jboss mysql cluster_jboss配置mysql数据库连接池

    jboss配置mysql数据库连接池 下面YJBYS小编为大家整理了关于jboss配置mysql数据库连接池的文章,希望对你有所帮助.更多Java认证考试信息,尽在应届毕业生培训网! 1:配置: JD ...

  5. Python操作数据库及Python实现mysql数据库连接池源代码

    简介 pymysql:纯Python实现的一个驱动.因为是纯Python编写的,因此执行效率不如MySQL-python.并且也因为是纯Python编写的,因此可以和Python代码无缝衔接. MyS ...

  6. Node.js实现MySQL数据库连接池

    Node.js实现MySQL数据库连接池 1 什么是数据库连接池 2 原理及优点 3 连接池的作用 4 实现连接池 4.1 导入mysql模块 4.2 创建数据库连接池 4.3 从连接池中获取一个连接 ...

  7. Tomcat中配置MySQL数据库连接池

    Web开发中与数据库的连接是必不可少的,而数据库连接池技术很好的优化了动态页与数据库的连接,相比单个连接数据库连接池节省了很大的资源.用一个通俗的比喻:如果一个人洗澡需花一桶水,那一百个人就要花一百桶 ...

  8. mysql数据库连接池_MySql数据库连接池

    1.传统链接(如下为示意图) 注意: (1).传统方式找DriverManager要连接,数目是有限的. (2).传统方式的close(),并没有将Connection重用,只是切断应用程序和数据库的 ...

  9. MySql数据库连接池

    1.传统链接(如下为示意图) 注意: (1).传统方式找DriverManager要连接,数目是有限的. (2).传统方式的close(),并没有将Connection重用,只是切断应用程序和数据库的 ...

  10. java连接mysql数据库连接池_java使用原生MySQL实现数据的增删改查以及数据库连接池技术...

    一.工具类及配置文件准备工作 1.1 引入jar包 使用原生MySQL,只需要用到MySQL连接的jar包,maven引用方式如下: mysql mysql-connector-java 5.1.48 ...

最新文章

  1. 企业网络推广——网站页面布局优化对于企业网络推广来说非同一般
  2. 【算法与数据结构】中缀表达式转为后缀表达式
  3. 部署高可用的Lync Server 2013 Part 4 部署高可用的文件共享DFS
  4. Aupera:FPGA让视频编码与AI结合水到渠成
  5. 高科技护航“史上最严”高考
  6. 用蒙特卡洛求pi_蒙特卡洛算法(MCS)及其MATLAB实现
  7. 设置将pip的下载源变更为国内源-windows配置方法
  8. 如何在Python中便宜地获取大文件的行数?
  9. 回到顶部功能:uniapp微信小程序回到顶部的几种方法
  10. 【X86】---关于Intel芯片架构的发展史
  11. android n ify三星,三星年度Android旗舰Galaxy S9包装盒曝光!
  12. 跑通Jetson Nano TensorRt sampleSSD例程
  13. Vue2之海康威视云台获取视频流数据
  14. Java VisualVM使用
  15. IDEA中如何将一个JavaWeb项目打包成war包
  16. Java中方法调用参数传递的方式是传值,尽管传的是引用的值而不是对象的值。(Does Java pass by reference or pass by value?)
  17. 中国15家外卖O2O大盘点-2014
  18. 虫虫危机(人物图鉴)
  19. 微波射频学习笔记22-------场效应管(MOS管)
  20. brew下载的mysql卸载_【已解决】Mac中如何彻底卸载之前通过dmg安装的mysql

热门文章

  1. Swift中如何重新懒加载
  2. Ubuntu14.04 + Matlab2014a + caffe + cuda + cudnn环境搭建
  3. C++中的static函数和extern关键字
  4. AIX系统CPU性能评估-1
  5. 第九章 线程与内核对象的同步(6)
  6. 使用SD-WAN策略与传统路由器的OFFICE 365配置
  7. BGP信息类型和分组公共首部
  8. sdn和nfv的区别—Vecloud微云
  9. UML-类图-需要写关联名称吗?
  10. django(models)视图与html 简单的操作