连接池

Posted q-1993

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了连接池相关的知识,希望对你有一定的参考价值。

1.基本概念
(1)服务器在启动时,一起创建了多个连接,这些连接放到一个对象中,这个对象就叫连接池。
(2)可以提高数据库建立连接时的性能;
2.编写数据源:
编写数据源时,不能关闭连接。解决办法:
(1)装饰设计模式
a.目的:改写已存在的类的某个方法或某些方法,装饰设计模式(包装模式)
b.步骤:
1)编写一个类,实现与被包装类相同的接口。(具备相同的行为)
2)定义一个被包装类类型的变量。
3)定义构造方法,把被包装类的对象注入,给被包装类变量赋值。
4)对于不需要改写的方法,调用原有的方法。
5)对于需要改写的方法,写自己的代码。
  //1)编写一个类,实现与被包装类相同的接口。(具备相同的行为)
public class MyConnection implements Connection {
  //2)定义一个被包装类类型的变量
private LinkedList<Connection> pool; private Connection oldConn;
  //3.定义构造方法
public MyConnection(Connection oldConn, LinkedList<Connection> pool){ this.oldConn=oldConn; this.pool = pool; } @Override public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException { return oldConn.prepareStatement(sql); } @Override public void close() throws SQLException { pool.addLast(oldConn); } @Override public Statement createStatement() throws SQLException { return null; }
    (2)默认适配器:装饰设计模式一个变体
本身就是一个装饰类,对原本没有任何改变
1)编写一个类,实现与被包装类相同的接口。(具备相同的行为)
2)定义一个被包装类类型的变量。
3)定义构造方法,把被包装类的对象注入,给被包装类变量赋值。
4)对于不需要改写的方法,调用原有的方法。
public class MyConnection_Warper extends ConnectionWarper {
    private Connection oldConn;
    private LinkedList<Connection> pool;
    public MyConnection_Warper(Connection oldConn, LinkedList<Connection> pool) {
        this.oldConn = oldConn;
        this.pool=pool;
    }
    @Override
    public void close() throws SQLException {
        pool.addLast(oldConn);
    }

3.常用的数据源配置
(1)DBCP
dbcp是Apache推出的Database Connection Pool
使用步骤:
1.添加jar包 commons-dbcp-1.4.jar commons-pool-1.5.6.jar
2.添加属性资源文件
3.编写数据源工具类
  
技术图片
public class DBCPUtil {
    private static DataSource ds = null;
    static {

        Properties prop = new Properties();

        //根据DBCPUtil的classes的路径,加载配置文件
        try {
            prop.load(DBCPUtil.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"));
            ds = BasicDataSourceFactory.createDataSource(prop);
        } catch (Exception e) {
            throw new ExceptionInInitializerError("初始化错误,请检查配置文件");
        }
    }

    public static Connection getConnection(){
        try {
            return ds.getConnection();
        } catch (SQLException e) {
            throw new RuntimeException("服务器忙。。。");
        }
    }
    public static void release(ResultSet rs, PreparedStatement ps,Connection conn){
        if(rs!=null){
            try {
                rs.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            rs = null;
        }
        if(ps!=null){
            try {
                ps.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            ps = null;
        }
        if(conn!=null){
            try {
                conn.close(); //关闭
            } catch (Exception e) {
                e.printStackTrace();
            }
            conn = null;
        }
    }
}
View Code

(2)C3P0
使用步骤:
1、添加jar包
2、编写配置文件
c3p0-config.xml,放在classpath中,或classes目录中
技术图片
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
  <default-config>
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/day13</property>
    <property name="user">root</property>
    <property name="password">1234</property>
    <property name="initialPoolSize">10</property>
    <property name="maxIdleTime">30</property>
    <property name="maxPoolSize">100</property>
    <property name="minPoolSize">10</property>

  </default-config>
</c3p0-config>
View Code

       3.编写工具类

public class C3P0Util {
    //得到一个数据源
    private static DataSource dataSource = new ComboPooledDataSource();
    //从数据源中得到一个连接对象
    public static Connection getConnection(){
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            throw new RuntimeException("服务器错误。。");
        }
    }
    public static void release(Connection conn, PreparedStatement ps, ResultSet rs){
        //关闭资源
        if(rs!=null){
            try {
                rs.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            rs = null;
        }
        if(ps!=null){
            try {
                ps.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            ps = null;
        }
        if(conn!=null){
            try {
                conn.close();//关闭
            } catch (Exception e) {
                e.printStackTrace();
            }
            conn = null;
        }
    }
}

4.用JavaWeb服务器管理数据源:Tomcat
开发JavaWeb应用,必须使用一个JavaWeb服务器,JavaWeb服务器都内置数据源。
Tomcat:(DBCP)
数据源只需要配置服务器即可。
配置数据源的步骤:
1、拷贝数据库连接的jar到tomcatlib目录下
2、配置数据源XML文件
a)如果把配置信息写在tomcat下的conf目录的context.xml中,那么所有应用都能使用此数据源。
b)如果是在当前应用的META-INF中创建context.xml, 编写数据源,那么只有当前应用可以使用。
<?xml version="1.0" encoding="UTF-8" ?>
<context>
    <Resource name="jdbc/day13" auth="Container" type="javax.sql.DataSource"
              maxActive="100" maxIdle="30" maxWait="10000"
              username="root" password="1234" driverClassName="com.mysql.jdbc.Driver"
              url="jdbc:mysql://localhost:3306/day13"/>
</context>
<body>
        <%
            Context initContext = new InitialContext();
            DataSource ds = (DataSource)initContext.lookup("java:/comp/env/jdbc/day13");// java:/comp/env/是固定路径
Connection connection = ds.getConnection(); out.print(connection); %>

 










































以上是关于连接池的主要内容,如果未能解决你的问题,请参考以下文章

连接池

数据库连接池的Java连接池

spring可以不用连接池吗

数据库连接池是啥

WebLogic中查看连接池的使用情况

08-连接池