连接池
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; } } }
(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>
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); %>
以上是关于连接池的主要内容,如果未能解决你的问题,请参考以下文章