从JDBC链接到C3P0数据库链接池
在Java开发中,使用JDBC操做数据库的四个步骤以下:java
①加载数据库驱动程序(Class.forName("数据库驱动类");)
②链接数据库(Connection con = DriverManager.getConnection();)
③操做数据库(PreparedStatement stat = con.prepareStatement(sql);stat.executeQuery();)
④关闭数据库,释放链接(con.close();)
②链接数据库(Connection con = DriverManager.getConnection();)
③操做数据库(PreparedStatement stat = con.prepareStatement(sql);stat.executeQuery();)
④关闭数据库,释放链接(con.close();)
也就是说,全部的用户都须要通过此四步进行操做,可是这四步之中有三步(①加载数据库驱动程序、②链接数据库、④关闭数据库,释放链接)对全部人都是同样的,而全部人只有在操做数据库上是不同,那么这就形成了性能的损耗。
那么最好的作法是,准备出一个空间,此空间里专门保存着所有的数据库链接,之后用户用数据库操做的时候不用再从新加载驱动、链接数据库之类的,而直接今后空间中取走链接,关闭的时候直接把链接放回到此空间之中。
那么此空间就能够称为链接池(保存全部的数据库链接)
什么是链接池:
链接池是建立和管理一个链接的缓冲池的技术,这些链接准备好被任何须要它们的线程使用;简单理解为,当一辆汽车搬运东西,若是使用jdbc链接,(jdbc链接:与数据库创建链接、发送操做数据库的语句并处理结果)那么每一次都要去打开数据库,得到链接,关闭数据库。假设汽车搬运的东西是链接,那么我可不能够每一次将链接搬运多个呢?而不是jdbc那样,一次只搬运一个链接,而后就把汽车扔掉?这时候,使用链接池。
原理:
链接池基本的思想是在系统初始化的时候,将数据库链接做为对象存储在内存中,当用户须要访问数据库时,并不是创建一个新的链接,而是从链接池中取出一个已创建的空闲链接对象。使用完毕后,用户也并不是将链接关闭,而是将链接放回链接池中,以供下一个请求访问使用。而链接的创建、断开都由链接池自身来管理。同时,还能够经过设置链接池的参数来控制链接池中的初始链接数、链接的上下限数以及每一个链接的最大使用次数、最大空闲时间等等。也能够经过其自身的管理机制来监视数据库链接的数量、使用状况等。 为何要用到链接池 数据库链接池的基本思想就是为数据库链接创建一个“缓冲池”。预先在缓冲池中放入必定数量的链接,当须要创建数据库链接时,只需从“缓冲池”中取出一个,使用完毕以后再放回去。咱们能够经过设定链接池最大链接数来防止系统无尽的与数据库链接。链接池主要由三部分组成:链接池的创建、链接池中链接的使用管理、链接池的关闭。数据库链接池的最小链接数和最大链接数的设置要考虑到如下几个因素:
- 最小链接数:是链接池一直保持的数据库链接,因此若是应用程序对数据库链接的使用量不大,将会有大量的数据库链接资源被浪费.
- 最大链接数:是链接池能申请的最大链接数,若是数据库链接请求超过次数,后面的数据库链接请求将被加入到等待队列中,这会影响之后的数据库操做
- 若是最小链接数与最大链接数相差很大:那么最早链接请求将会获利,以后超过最小链接数量的链接请求等价于创建一个新的数据库链接.不过,这些大于最小链接数的数据库链接在使用完不会立刻被释放,他将被放到链接池中等待重复使用或是空间超时后被释放
下面这是c3p0数据库链接池的运行机制 mysql
(1) 程序初始化时建立链接池
(2) 使用时向链接池申请可用链接
(3) 使用完毕,将链接返还给链接池
(4) 程序退出时,断开全部链接,并释放资源sql
我用的开发工具是IDEA,建立的是Maven项目,要使用c3p0须要配置相关模块,如图所示数据库
<!-- mysql驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.0.5</version> </dependency> <!-- c3p0 --> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> </dependency>
db.properties 文件名不能改, 必须放在src下 ,配置文件中的key名称不能变工具
好,完成这些后开始链接数据库性能
package jdbc; import com.mchange.v2.c3p0.ComboPooledDataSource; import java.beans.PropertyVetoException; import java.io.FileInputStream; import java.io.IOException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Properties; public class JDBCUtils { public void setConnection() throws SQLException, PropertyVetoException, IOException { //建立链接池 ComboPooledDataSource dataSource = new ComboPooledDataSource(); //加载配置文件 Properties properties = new Properties(); properties.load(new FileInputStream("src/main/java/db.properties")); String driver = properties.getProperty("driver"); String url = properties.getProperty("url"); String username = properties.getProperty("username"); String password = properties.getProperty("password"); //得到链接 Connection conn = null; PreparedStatement ps = null; ResultSet res = null; dataSource.setDriverClass(driver); dataSource.setJdbcUrl(url); dataSource.setUser(username); dataSource.setPassword(password); conn = dataSource.getConnection(); String sql = "select * from user"; ps = conn.prepareStatement(sql); res = ps.executeQuery(); while (res.next()){ System.out.println(res.getInt("id")+" "+res.getString("username")+" "+res.getString("password")); } } } class text{ public static void main(String[] args) throws PropertyVetoException, SQLException, IOException { JDBCUtils jdbcUtils = new JDBCUtils(); jdbcUtils.setConnection(); } }
本文同步分享在 博客"泰斗贤若如"(CNBlog)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。开发工具