连接池是管理连接对象的,是依赖JDBC创建出来的连接Connection,然后管理它。
所以在以下示例中有的需要用到MySQL的驱动和连接池共同使用。
1.封装得到Connection对象
所需MySQL驱动:mysql-connector-java-5.1.7-bin.jar
JdbcUtils.java:
package cn.itcast.jdbc; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties; //v1.0 public class JdbcUtils { //私有的 静态对象 //类中的任何成员函数都可以访问静态变量 但是静态成员函数不能直接访问非静态成员,只能通过该类的 //对象名访问该对象的非静态成员。这是因为静态成员函数属于整个类的,没有特指向某个对象的this指针 private static Properties props=null; static{ //给props进行初始化,即加载dbconfig.properties文件到props对象中 //加载配置文件 取得该class对象类的类装载器 InputStream in=JdbcUtils.class.getClassLoader() .getResourceAsStream("dbconfig.properties"); props=new Properties(); try { props.load(in); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } //// try { Class.forName(props.getProperty("driverClassName")); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static Connection getConnection() throws SQLException{ /* * 1加载配置文件 * 2加载驱动类 * 3调用DriverManager * */ return DriverManager.getConnection(props.getProperty("url"), props.getProperty("username"), props.getProperty("password")); } }
其配置文件dbconfig.properties:
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/oa?rewriteBatchedStatements=true username=root password=root
2.DBCP数据库连接池
----创建的Connection对象可重用。
1)池参数====所有池参数都有默认值
2)连接池也是使用四大连接参数来完成创建连接对象!
DBCP数据库连接池所需jar包
commons-dbcp-1.4.jar依赖commons-pool-1.3.jar
mysql-connector-java-5.1.7-bin.jar
3)底层使用的装饰者模式
Java的JDK中有这个包javax.sql.DataSource(接口)
4)连接池必须实现:javax.sql.DataSource接口!----该接口中有getConnection()方法。这样就可以得到Connection对象!!!
连接池返回的Connection对象,它的close()方法。调用它的close()方法不是关闭,而是把连接归还给池!
代码:---利用数据库连接池得到连接对象
package cn.itcast.jdbc; import java.sql.Connection; import java.sql.SQLException; import org.apache.commons.dbcp.BasicDataSource; import org.junit.Test; //DBCP连接池 public class Demo1 { @Test public void fun1() throws SQLException{ /* * 1.创建连接池对象 * 2.配置四大参数 * 3.配置池参数 * 4.得到连接对象 * */ BasicDataSource dataSoure=new BasicDataSource(); dataSoure.setDriverClassName("com.mysql.jdbc.Driver"); dataSoure.setUrl("jdbc:mysql://localhost:3306/oa"); dataSoure.setUsername("root"); dataSoure.setPassword("root"); //池参数 dataSoure.setMaxActive(20);//最大活动连接数 dataSoure.setMinIdle(3);//最小空闲连接数 dataSoure.setMaxWait(1000);//最长等待时间(毫秒) Connection con=dataSoure.getConnection(); System.out.println(con.getClass().getName()); /* * 连接池内部使用四大参数创建了连接对象!即MySQL驱动提供的Connection * 连接池使用MySQL的连接对象进行了装饰,只对close()方法进行了增强! * 装饰之后的Connection的close()方法,用来把当前连接归还给池! * * */ con1.close();//把连接归还给池 } }
结果:org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
对close方法进行装饰!!!
3.C3P0连接池
1)C3P0也是开源免费的连接池!
2)C3P0的使用
C3P0中池类是:ComboPooledDataSource
3)所需jar包
c3p0-0.9.2-pre1.jar
mchange-commons-0.2.jar
mysql-connector-java-5.1.7-bin.jar
4)底层使用的是动态代理
5)代码实现:---代码配置
package cn.itcast.demo1; import java.beans.PropertyVetoException; import java.sql.Connection; import java.sql.SQLException; import org.junit.Test; import com.mchange.v2.c3p0.ComboPooledDataSource; //c3p0 public class Demo1 { @Test public void fun1() throws PropertyVetoException, SQLException{ //创建连接池对象 ComboPooledDataSource cd=new ComboPooledDataSource(); //配置四大参数 cd.setDriverClass("com.mysql.jdbc.Driver"); cd.setJdbcUrl("jdbc:mysql://localhost:3306/oa"); cd.setUser("root"); cd.setPassword("root"); //池配置 cd.setAcquireIncrement(5); cd.setInitialPoolSize(20); cd.setMinPoolSize(2); cd.setMaxPoolSize(50); Connection con=cd.getConnection(); System.out.println(con); con.close();//把链接归还给池 } } //控制台里的红色时日志,可以修改log4j把它干掉
结果:com.mchange.v2.c3p0.impl.NewProxyConnection@367a8bd9
底层是动态代理实现的
配置文件
配置文件要求:
* 文件名称:必须叫c3p0-config.xml
* 文件位置:必须放在src下
6)配置文件(默认)配置:---得到连接
c3p0-config.xml:
<?xml version="1.0" encoding="UTF-8" ?> <c3p0-config> <!-- 默认配置信息 --> <default-config> <!-- 连接四大参数配置 --> <property name="jdbcUrl">jdbc:mysql://localhost:3306/oa</property> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="user">root</property> <property name="password">root</property> <!-- 池参数配置 --> <property name="acquireIncrement">3</property> <property name="initialPoolSize">10</property> <property name="minPoolSize">2</property> <property name="maxPoolSize">10</property> </default-config> </c3p0-config>
测试:
//配置文件的默认配置 @Test public void fun2() throws SQLException{ //在创建连接池对象时,这个对象就会自动加载配置文件!不用我们来指定 ComboPooledDataSource dataSource=new ComboPooledDataSource(); Connection con=dataSource.getConnection(); System.out.println(con); con.close(); }
结果:com.mchange.v2.c3p0.impl.NewProxyConnection@27736f80
如果在该测试中写入各参数的配置,则会覆盖掉配置文件!!!
7)命名的配置
c3p0-config.xml:
<?xml version="1.0" encoding="UTF-8" ?> <c3p0-config> <!-- 专门为oracle提供的信息 --> <named-config name="oracle-config"> <!-- 连接四大参数配置 --> <property name="jdbcUrl">jdbc:mysql://localhost:3306/oa</property> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="user">root</property> <property name="password">root</property> <!-- 池参数配置 --> <property name="acquireIncrement">3</property> <property name="initialPoolSize">10</property> <property name="minPoolSize">2</property> <property name="maxPoolSize">10</property> </named-config> </c3p0-config>
测试:
//使用命名配置信息 @Test public void fun3() throws SQLException{ //构造器的参数指定命名配置元素的名称<named-config name="oracle-config"> ComboPooledDataSource dataSource=new ComboPooledDataSource("oracle-config"); Connection con=dataSource.getConnection(); System.out.println(con); con.close(); }
结果:com.mchange.v2.c3p0.impl.NewProxyConnection@297cebc9
4.重新封装JdbcUtils这个类(里面是由连接池得到的连接)
package cn.itcast.jdbc; import java.sql.Connection; import java.sql.SQLException; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; public class JdbcUtils { //使用文件的默认配置,要求必须给出c3p0-config.xml private static ComboPooledDataSource dataSource=new ComboPooledDataSource(); //使用连接池返回一个连接对象 public static Connection getConnection() throws SQLException{ return dataSource.getConnection(); } //返回连接池对象 public static DataSource getDataSource(){ return dataSource; } }
使用的是默认的配置文件!
5.Tomcat配置连接池===(配置后可以得到连接池对象,再去得到连接对象)
1)Tomcat配置JNDI资源
JNDI(Java Naming and Directory Interface),Java命名和目录接口,JNDI的作用就是:在服务器上配置资源,然后通过统一的方式来获取配置的资源。
我们这里要配置的资源是连接池,这样项目中就可以通过统一的方式来获取连接池对象。
配置JNDI资源需要到<Context>元素中配置<Resource>子元素:
* name:指定资源的名称,这个名称可以随便给,在获取资源时需要这个名称;
* factory:用来创建资源的工厂,这个值基本上是固定的,不用修改;
* type:资源的类型,我们需要给出的类型当然是我们连接池的类型了;
* bar:表示资源的属性,如果资源存在名为bar的属性,那么就配置bar的值。对于DBCP连接池而言,你需要配置的不是bar,因为它没有bar这个属性,而是应该去配置url、username等属性。
2)获取资源
配置资源的目的当然是为了获取资源。只要你启动了Tomcat,那么就可以在项目中任何类中通过JNDI获取资源的方式来获取资源了。
获取资源:
* Context:javax.naming.Context;
*InitialContext:javax.naming.InitialContext;
*lookup(String):获取资源的方法,其中“javax:comp/env”是资源的入口(这是固定的名称),获取过来的还是一个Context,这说明需要在获取到的Context上进一步进行获取。“bean/MyBeanFactory”对应<Resource>中配置的name值,这回获取的就是资源对象了。
=======在电脑上测试没有成功======