数据库基础(四):数据源

1.自己手写一个数据库连接池
2.装饰模式,动态代理模式
3.通过动态代理实现数据库连接池
4.DBCP开源数据库连接池
5.C3P0开源数据库连接池
6.为Tomcat配置数据源
 

1.自己手写一个数据库连接池

           public class MyPool implements DataSource{

                      private static List<Connection> pool = new LinkedList<Connection>();

                      static{

                                 try{

                                            Class.forName("com.mysql.jdbc.Driver");

                                            for(int i=0;i<5;i++){

                                                 Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc","root","root");

                                                 pool.add(conn);

                                            }

                                 }catch(Exception e){

                                            e.printStackTrace();

                                            throw new RuntimeException(e);

                                 }

                      }

                      public Connection getConnection throws SQLException{

                                 if(pool.size()==0){

                                                 Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc","root","root");

                                                 pool.add(conn);

                                 }

                                 return pool.remove(0);

                      }

                      public void returnConn(Connection conn){

                                 try{

                                            if(conn != null && !conn.close()){

                                                       pool.add(conn);

                                            }

                                 }catch(Exception e){

                                            e.printStackTrace(e);

                                 }

                      }

           }

 

2.装饰模式,动态代理模式

           装饰模式:写一个类和被装饰者实现相同的接口,以保证装饰者和被装饰者有相同的方法。再提供构造方法允许用户将被装饰者传进来,对于不想改造的方法调用原来的,想改造的自己写

                      缺点:当被装饰者的方法太多时,那些不想改造的方法需要一个个调用,太麻烦。

           动态代理模式:在已经有一个对象的前提下,再创建一个代理对象。谁想调用被代理的方法,就要先去调用代理对象。代理对象对于不想改造的让用户调原来的,对于想改造的,代理者自己写。

 

3.通过动态代理实现数据库连接池

           自定义的连接池写了将conn还回pool的方法,但是用户不知道,用户只知道conn.close(),而且conn已经是一个对象了。在已有对象的前提下改造其中的方法,用动态代理。

           public Connection getConnection throw SQLException{

                      if(pool.size()==0){

                                 for(int i=0;i<3;i++){

                                            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc","root","root");

                                            pool.add(conn);

                                 }

                      }

                       final Connection conn = pool.remove(0);

                       Connection proxy = (Connection)Proxy.newProxyInstance(conn.getClass().getClassLoader(),conn.getClass().getInterfaces(),new InvocationHandler(){

           public Object invoke(Object proxy,Method method,Object[] args){

                      if("close".equals(method.getName())){

                                 returnConn(conn);

                                 return null

                      }else{

                                 return method.invoke(conn,args);

                      }

           }

});

           return proxy;

}

 

我们自己都能写连接池了,别人肯定早就帮我们想好了,下面看看开源的数据库连接池

 

4.DBCP开源数据库连接池

           方法一:(直接定义)

                      BasicDataSource source = new BasicDataSource();

                      source.setDriver("com.driver.mysql.jdbc");

                      source.setUrl("jdbc:mysql://localhost:3306/jdbc");

                      source.setUserName("root");

           方法二:(运用配置文件定义)

                      Properties prop = new Properties();

                      prop.load(new FileReader("dbcp.config"));

                      BasicDataSourceFactory factory = new BasicDataSourceFactory();

                      DataSource source = factory.createSource(prop);

           注:常用属性

                      driverClassName=com.mysql.jdbc.Driver    //驱动

                      url=jdbc:mysql://localhost:3306/jdbc

                      username=root

                      password=root

                      initalSize=10    //初始化连接

                      maxActive=50    //最大连接数

                      minIdle/maxIdle=10    //最小/最大空闲数

                      maxWait=60000    //超时等待时间(毫秒为单位)

 

5.C3P0开源数据库连接池

           方法一:(直接设置)

                      CompoPooledDataSource source = new CompoPooledDataSource();

                      source.setDriverClass("com.mysql.jdbc.Driver");

                      source.setJdbcUrl("jdbc:mysql://localhost:3306/jdbc");

                      source.setUser("root");

                      source.setPassword("root");

           方法二:(通过配置文件配置)

                      ComboPooledDataSource source = new ComboPooledDataSource();

                      在类加载器目录下名称为c3p0-config配置文件下配置:

                      <c3p0-config>

                                 <default-config>

                                            <property name="driverClass">com.mysql.jdbc.Driver</property>

                                            <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc</property>

                                            <property name="user">root</property>

                                            <property name="password">root</property>

                                 </default-config>

                      </c3p0-config>

                      注:如果有报错,说什么东西找不到的话,加上下面这句话:

                      System.setProperty("javax.xml.parses.DocumentBuliderFactory","com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");

 

6.为Tomcat配置数据源

           (1).为所以的web应用配置

                      tomcat/conf/context.xml的<Context>中配置

           (2).为专门的web应用配置

                      ^1.tomcat/conf/server.xml中的<Host>

                      ^2.tomcat/conf/xxx.xml,自己写一个xml

                      ^3.将web应用放在虚拟主机管理的目录下,然后在META-INF文件夹下创建一个context.xml,在<Context>标签中配置如下:

                      <Resource name="mySource" auth="Container" type="javax.sql.DataSourcde" username="root" password="root" droverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/jdbc" maxActive="8" maxIdle="4"/>

           (3).怎么在程序中获的这个数据源

                      Context initCtx = new InitialContext();

                      Context jndi = (Context)initCtx.lookup("java:comp/env);

                      DataSource source = jndi.lookup("mySource");

 

           

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鹏哥哥啊Aaaa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值