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

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");

           

猜你喜欢

转载自blog.csdn.net/qq_40594696/article/details/86439946