JDBC自定义 数据库连接池
来源:互联网 发布:水果竞猜php源码 编辑:程序博客网 时间:2024/05/17 22:31
数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正式针对这个问题提出来的.数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。
在不使用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); } }}
1 0
- JDBC自定义 数据库连接池
- 自定义JDBC数据库连接池小例子
- JDBC数据库连接池
- jdbc数据库连接池
- JDBC---数据库连接池
- JDBC数据库连接池
- JDBC数据库连接池配置
- JDBC-数据库连接池dbcp
- JDBC数据库连接池总结
- JDBC数据库连接池
- JDBC 数据库连接池
- JDBC数据库连接池
- 简单JDBC数据库连接池
- Java -- JDBC 数据库连接池
- JDBC 数据库连接池 配置
- jdbc-数据库连接池
- JDBC : 数据库连接池
- Java jdbc数据库连接池
- hdu 5676
- 拓扑排序
- HDU 3085 双向BFS
- 修改Chrome默认的搜索引擎
- 基于图灵机器人接口的简单NLP学习
- JDBC自定义 数据库连接池
- eclipse快捷键
- 日积月累:Proguard进行Android代码混淆
- 一些安卓的基本权限 清单配置文件
- HDU 1257 最少拦截系统(贪心)
- 用Handler与Timer实现progressDialog倒计时
- css三列布局,中间div固定,两侧div宽度自适应
- EasyAR-Unity SDK使用文档
- AsyncTask的基本用法