您的位置:首页 > 编程语言 > Java开发

java中的连接池

2015-09-08 22:36 375 查看
以前连接数据库都是采用 jdbc 的方式来连接的,但是用这种方式连接数据库有一些问题。

                    问题:当某个网站同时访问的人数超出一定范围时数据库会崩溃(比如:淘宝也用jdbc的方式,那么双 11的 0点左右 同时访问的人数过多时数据库可能崩溃)

                                即使避免了这种情况,那么系统性能会降低。解决这种问题的最好办法就是用连接池的方式连接数据库。

一、连接池的原理

                    连接池我们也可以叫做 “缓冲池” ,提前在“连接池”中设定好一定数量的数据库连接对象,当用户连接数据库时,从“池子”中取出一个连接对象,当用户使用完之后关闭连接了再把取出的重新放到池子中           

            当连接池中的所有连接对象都已经被用完,那么其他用户连接数据库时,需要等待,如果超过等待时间,那么返回值 -1

注:连接池的方式用两种,但我们用的最多的是第二种

二、“JDNI” 连接池的使用(该方式一般都不会使用,重点介绍第二种方式)

                   JDNI:(java命名目录和规则的api),JDNI 是tomcat提供的一个标准的一个连接池

                                使用步骤:

                                                 1、将数据库的驱动包,放在tomcat的lib目录中

                                                 2、修改tomcat中conf目录下面 cotext.xml文件

                                                                          配置连接池的相关参数

                                                                          <Resource

                                                                                       name=""  数据源引用名称(自定义)

                                                                                       type=""  数据源对应类型,包.类名

                                                                                       auth=""  管理者 //Container

                                                                                       username="" 用户名

                                                                                       password="" 密码

                                                                                       url=""  路径

                                                                                       driverClassName="" 驱动名

                                                                                       maxActive=""  最大连接数

                                                                                       maxIdle=""    最大空闲数

                                                                                       maxWait=""    等待时间,单位毫秒    

                                                                          />

                                                 3、修改项目中 web.xml文件

<resource-ref>
        <res-ref-name>数据源引用名称</res-ref-name>
        <res-type>数据源对应类型</res-type>
        <res-auth>Container</res-auth>
</resource-ref>                                                4、java代码如下
import java.sql.Connection;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class DBUtil {

    
    /**
     * 打开连接
     * @return
     */
    public static Connection getConn()
    {
        Connection conn = null;
        
        try {
            //创建容器对象
            Context ctt = new InitialContext();
            //创建数据源对象
            DataSource ds =(DataSource)ctt.lookup("java:comp/env/数据源引用名称");
            
            conn=ds.getConnection();
            
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return conn;
    }
}

三、DBCP 连接池的使用(这种方式使用的最多)

                     DBCP(database ConnectionPool) 数据库连接池,第三方提供的一种连接池,是别人封装好的,我们自己不用写配置文件,别人已经帮我们写好了的

                                使用步骤:

                                       1、 找到需要的jar包 (commons.pool-1.5.3.jar 和 commons-dbcp.jar ,一共需要两个),放在自己项目的 lib 中。

                                       2、 自己建立连接数据库的工具类,在工具类中从 “连接池”中取出 连接对象

                                      

import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;

public class DBUtil {
    private static DataSource ds;

    public static Connection getCon() {
        Connection con = null;
        if (ds == null) {
            initDataSource();
        }
        try {
            con = ds.getConnection();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return con;
    }

    /**
     * 设置连接池的参数,以及得到数据源的对象
     */
    public static void initDataSource() {
        // 设置连接池的参数:该方法是由第三方(DBCP)提供的,是别人封装好的
        BasicDataSource dbs = new BasicDataSource();
        // 数据库登录用户名
        dbs.setUsername("scott");
        // 数据库登录密码
        dbs.setPassword("tiger");
        // 路径
//如果要连接sqlserver则是:jdbc:sqlserver://localhost:1433;database=数据库名称
        dbs.setUrl("jdbc:oracle:thin:@localhost:1521:orcl");
        // 驱动名
        // 我链接的是oracle数据库,如果要连接sqlserver则是:com.microsoft.sqlserver.jdbc.SQLServerDriver
        dbs.setDriverClassName("oracle.jdbc.driver.OracleDriver");

        // 设置最大连接数
        dbs.setMaxActive(100);
        // 设置最大空闲数
        dbs.setMaxIdle(30);
        // 设置等待时间,单位:毫秒
        dbs.setMaxWait(10000);

        ds = dbs;
    }
    // 测试有没有链接成功
    // public static void main(String[] args) {
    // System.out.println(getCon());
    // }
}
                   3、 可以自己建立 “资源文件.properties”  存储 连接池的各种参数(一般我们是在src的下面建立,后缀名为 properties)

                          然后点击右边的 Add 添加(是通过 key--value 的形式保存的)

import java.sql.Connection;
import java.sql.SQLException;
import java.util.ResourceBundle;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;

public class DBUtil {

    //定义数据源对象
    private static DataSource ds;
    
    /**
     * 打开连接数据库(从连接池中取出连接对象)
     * @return
     */
    public static Connection getConn()
    {
        Connection conn = null;
        //判断ds是否为空
        if(ds==null)
        {
            initDataSource();
        }        
        try {
            //从连接池中取出连接对象
            conn = ds.getConnection();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        return conn;
    }
    
    /**
     * 设置连接池的参数,以及 得到数据源对象
     */
    public static void initDataSource()
    {
        //创建对象,读取资源文件中的信息,其中的参数就是:资源文件的路径  如:com.cn.dbcp
        ResourceBundle rb = ResourceBundle.getBundle(path);
        String userName=rb.getString("username");
        String password =rb.getString("password");
        String url = rb.getString("url");
        String driverClassName =rb.getString("driverClassName");
        String maxActive =rb.getString("maxActive");
        String maxIdle = rb.getString("maxIdle");
        String maxWait = rb.getString("maxWait");
        
        //设置连接池的参数
        BasicDataSource bds = new BasicDataSource();        
        //设置参数
        bds.setUsername(userName);
        bds.setPassword(password);
        bds.setUrl(url);
        bds.setDriverClassName(driverClassName);
        
        bds.setMaxActive(Integer.parseInt(maxActive));
        bds.setMaxIdle(Integer.parseInt(maxIdle));
        bds.setMaxWait(Long.parseLong(maxWait));
         
        ds=bds;
    }
    //测试是否连接成功
    public static void main(String[] args) {
        System.out.println(getConn());
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java oracle 数据库 jdbc