JDBC自定义 数据库连接池
2016-05-02 16:07
453 查看
数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正式针对这个问题提出来的.数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。
1. 创建数据库连接类 JdbcUtils 。
2. 创建类MyDataSource类 实现DataSource接口,该类下的步骤主要有:
1) 批量的实现数据库的连接,并把创建的连接放入到LinkList中(因为要进行增和删操作,Linklist比ArrayList性能 高上许多);
2)实现getConnection方法,让getConnection方法每次调用时,从LinkedList中取一个Connection返回给用户, 3)在该类中创建方法addBackToPool(Connection con),当用户使用完后,重新将连接 放回到连接池中。
3.编写测试类 进行测试
具体的代码如下:
数据库连接类—通过读取配置文件properties文件中的配置信息,配置文件就不列举了
连接池类
简单的测试类
在不使用C3P0等开源的数据库连接池的情况下,我们尝试使用自定义数据库连接池来 了解Jdbc连接池的原理及其功能作用。
自定义连接池实现的几个步骤:1. 创建数据库连接类 JdbcUtils 。
2. 创建类MyDataSource类 实现DataSource接口,该类下的步骤主要有:
1) 批量的实现数据库的连接,并把创建的连接放入到LinkList中(因为要进行增和删操作,Linklist比ArrayList性能 高上许多);
2)实现getConnection方法,让getConnection方法每次调用时,从LinkedList中取一个Connection返回给用户, 3)在该类中创建方法addBackToPool(Connection con),当用户使用完后,重新将连接 放回到连接池中。
3.编写测试类 进行测试
具体的代码如下:
数据库连接类—通过读取配置文件properties文件中的配置信息,配置文件就不列举了
package com.mystore.utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.ResourceBundle; /** * 提供数据库连接池 和数据库连接 * 方法为静态的 通过类型访问 * @author huhongda * */ public class JdbcUtils { private static String driverName = null; private static String url=null; private static String userName = null; private static String userPwd =null; //读取配置文件中的内容 //静态方法块 static{ ResourceBundle bundle = ResourceBundle.getBundle("dataBase"); driverName = bundle.getString("driverName"); url = bundle.getString("url"); userName= bundle.getString("userName"); userPwd = bundle.getString("userPwd"); } //建立连接 public static Connection getConnection(){ try { //注册驱动 loadDriver(); //System.out.println("创建连接成功"); //建立连接 并返回 return DriverManager.getConnection(url, userName, userPwd); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return null; } //注册驱动 public static void loadDriver(){ try { Class.forName(driverName); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } //释放资源 public static void release(ResultSet rs,Statement stat,Connection con){ //存在连接或结果集的时候 释放 if(rs!=null){ try { rs.close(); } catch (Exception e) { // TODO: handle exception } rs= null; } if(stat!=null){ try { stat.close(); } catch (Exception e) { // TODO: handle exception } stat = null; } if(con!=null){ try { con.close(); } catch (Exception e) { // TODO: handle exception } con = null; } } }
连接池类
package DataSource; import java.io.PrintWriter; import java.sql.Connection; import java.sql.SQLException; import java.util.LinkedList; import javax.sql.DataSource; import com.mystore.utils.JdbcUtils; //简单的实现自定义 连接池 public class MyDataSource implements DataSource { //通过 linkList充当 池 private LinkedList<Connection> pool = new LinkedList<Connection>(); //构造 函数 初始化 连接 数目 public MyDataSource(){ System.out.println("构造函数 创建 20个连接"); for (int i = 0; i < 20; i++) { //创建 连接 Connection connection = JdbcUtils.getConnection(); //把 创建的连接 放入池子中 pool.add(connection); } } //用完 之后 将传递的连接放回 池中 public void addBackToPool(Connection connection){ pool.add(connection); } @Override public PrintWriter getLogWriter() throws SQLException { // TODO Auto-generated method stub return null; } @Override public void setLogWriter(PrintWriter out) throws SQLException { // TODO Auto-generated method stub } @Override public void setLoginTimeout(int seconds) throws SQLException { // TODO Auto-generated method stub } @Override public int getLoginTimeout() throws SQLException { // TODO Auto-generated method stub return 0; } @Override public <T> T unwrap(Class<T> iface) throws SQLException { // TODO Auto-generated method stub return null; } @Override public boolean isWrapperFor(Class<?> iface) throws SQLException { // TODO Auto-generated method stub return false; } //从线程池 中 取得 第一个 @Override public Connection getConnection() throws SQLException { // TODO Auto-generated method stub //首先 判断 是否为空 if(pool.isEmpty()){ //为空的话 继续创建 5个连接 for (int i = 0; i < 5; i++) { Connection connection = JdbcUtils.getConnection(); pool.add(connection); } } //有连接的话 就取出第一个 Connection con = pool.removeFirst(); System.out.println("取得一个连接 使用"); return con; } @Override public Connection getConnection(String username, String password) throws SQLException { // TODO Auto-generated method stub return null; } }
简单的测试类
package DataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import com.mystore.utils.JdbcUtils; //对自定义 连接池的 测试 public class TestDataSource { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Connection connection = null; PreparedStatement stmt = null; MyDataSource ds = null; ResultSet rs =null; try { ds = new MyDataSource(); //从连接池 中 取得 连接 connection = ds.getConnection(); stmt = connection.prepareStatement("update users set passward ='123' where userName=?"); //给占位符 设值 stmt.setString(1,"huhongda"); //执行 stmt.executeUpdate(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); }finally{ //最终 将 连接 放回到 连接池中 ds.addBackToPool(connection); System.out.println("使用完 后将连接 放回 连接池中"); //释放 资源 并 不将连接 释放 JdbcUtils.release(rs, stmt, null); } } }
相关文章推荐
- jdbc中的Statement和PreparedStatement接口对象
- JDBC 数据库常用连接 链接字符串
- .net数据库连接池配置技巧(默认值)
- JDBC连接Access数据库的几种方式介绍
- JDBC程序更新数据库中记录的方法
- JDBC 程序的常见错误及调试方法
- 在Java的JDBC使用中设置事务回滚的保存点的方法
- Java中使用JDBC操作数据库简单实例
- Java加载JDBC驱动程序实例详解
- JSP使用JDBC完成动态验证及采用MVC完成数据查询的方法
- JSP基于JDBC的数据库连接类实例
- JSP中使用JDBC访问SQL Server 2008数据库示例
- jsp+jdbc实现连接数据库的方法
- 解析jdbc处理oracle的clob字段的详解
- JDBC数据库的使用操作总结
- jdbc操作mysql数据库实例
- JSP使用JDBC连接MYSQL数据库的方法
- Java开发Oracle数据库连接JDBC Thin Driver 的三种方法
- java使用jdbc操作数据库示例分享
- JDBC之PreparedStatement类中预编译的综合应用解析