zoukankan      html  css  js  c++  java
  • 连接池并发的实现原理

    
    1 . 概述和说明 
    在数据库操作中,和数据库建立连接(Connection)是最为耗时的操作之一,而且数据库都有最大连接数目的限制,
    如何很多用户访问的是同一数据库,所进行的都是相同的操作,比如查询记录,那么,为每个用户都建立一个连接是不合理的 
    连接池的思想:Tomcat服务器可以事先预备好若干个连接对象,
    将这些连接对象存放在一个称为连接池的容器中(通常由链表承担这一角色)当某用户需要操作数据库时,
    只要从连接池中取出一个连接对象即可,当用户使用完改连接对象后,将该连接对象放回到连接池中,
    如果某用户需要操作数据库时,连接池中已没有连接对象可用,那么该用户就必须等待,
    直到连接池中有了连接对象为止。 
    例:WebLogic,WebSphere 连接池和数据源都是由自己操作管理
    2 . 案例 
    IBM项目在读写MQ消息队列中,用的是此思想
    3 . 程序的调用注释和配置文件的说明
    
    
    package database.operation; 
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.LinkedList;
    public class ApplicationCon {
    private static ApplicationCon manager = new ApplicationCon();
    private static LinkedList<Connection> list;// 存放Connection 对象的链表
    private static final int MAX = 10;// 最大连接数
    public static String DRIVERNAME = "com.newatlanta.jturbo.driver.Driver"
    public static String URL = "jdbc:JTurbo://127.0.0.1/DBA/charset=GBK"
    public static String UID = "sa"
    public static String PWD = ""
    private Connection con = null
    //单例模式
    public static ApplicationCon getInstance() {
    return manager
    }
    public ApplicationCon() {
    try {
    Class.forName(DRIVERNAME);
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    listnew LinkedList<Connection>();
    for (int i = 0; i <= MAX; i++) {
    try {
    con = DriverManager.getConnection(URL , UID , PWD );
    list.add(con);
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }
    //单线程,当前线程没有结束,其他线程处于等待
    public synchronized Connection getOneConnection() {
    if (list.size() > 0)
    return list.removeFirst();// 链表删除第一个节点,并返回该节点中的连接对象;
    else
    return null
    }
    //单线程,当前线程没有结束,其他线程处于等待
    public synchronized void puBackOneConnection(Connection con) {
    list.addFirst(con);
    }
    /**
    * 该方法执行增,删,改操作
    */

    public void executeUpdate(String strSql) throws SQLException {
    Statement stat = con.createStatement();
    stat.executeUpdate(strSql);
    }
    /**
    * 该方法执行查询操作,并返回结果集
    */

    public ResultSet executeQuerry(String strSql) throws SQLException {
    Statement stat = con.createStatement();
    return stat.executeQuery(strSql);
    }
    4 . 如何调用 
    /** 
    * 调用规则:ApplicationCon m =ApplicationCon.getInstance();
    * Connection connection =m.getOneConnection();
    * 执行增删改查操作
    * m.puBackOneConnection(connection);
    */
  • 相关阅读:
    js正则表达式中的问号使用技巧总结
    380. Insert Delete GetRandom O(1)
    34. Find First and Last Position of Element in Sorted Array
    162. Find Peak Element
    220. Contains Duplicate III
    269. Alien Dictionary
    18. 4Sum
    15. 3Sum
    224. Basic Calculator
    227. Basic Calculator II
  • 原文地址:https://www.cnblogs.com/shiGuangShiYi/p/10117544.html
Copyright © 2011-2022 走看看