美文网首页
JavaEE-JDBC基础-连接池(数据源)

JavaEE-JDBC基础-连接池(数据源)

作者: lioilwin | 来源:发表于2017-08-26 20:32 被阅读35次
    数据库连接池(数据源): 批量创建和数据库之间的连接,缓存到连接池中,提高连接性能。
    

    1.编写连接池

    1)实现javax.sql.DataSource接口,批量创建与数据库的连接,存到集合对象;
    2)实现getConnection方法,从集合对象取出Connection;
    3)动态代理改造Connection.close方法,把连接返回到集合对象。
    
    改造类的方法: 继承/装饰/动态代理(java.lang.reflect.Proxy)
    
    
    public class connDataSource implements DataSource {
        private static final List<Connection> connList = new LinkedList<>();
        
        static {
            Class.forName(数据库驱动类全名);
            // 批量创建与数据库的连接,存入connList对象
            for (int i = 0; i < 10; i++) {
                Connection conn = DriverManager.getConnection(url);
                // 动态代理改造close方法
                Connection connProxy = (Connection) Proxy.newProxyInstance(conn.getClass().getClassLoader(), 
                                        conn.getClass().getInterfaces(), 
                                        new InvocationHandler(){
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        if ("close".equals(method.getName())) {
                            // 改造close方法,把连接返回到connList对象       
                            if (conn != null && !conn.isClosed()) {
                                connList.add(conn);                         
                            }                   
                            return null;
                        } else {
                            // 其它方法继续保持不变
                            return method.invoke(conn, args);
                        }
                    }
                });
                connList.add(connProxy);
            }
        }
    
        public Connection getConnection() throws SQLException {     
            Connection connProxy = connList.remove(0);
            return connProxy;
        }
    }
    
    

    2.开源数据库连接池

    ①.DBCP数据源

    Apache软件基金组织下的开源数据库连接池实现, Tomcat连接池也是采用该连接池来实现。
    导入的jar包: commons-dbcp.jar(连接池的实现)、commons-pool.jar(连接池实现的依赖库)
    
    获取连接方式1
        BasicDataSource source = new BasicDataSource();
        source.setDriverClassName(数据库驱动类全名);
        source.setUrl(数据库地址);
        source.setUsername(用户);
        source.setPassword(密码);
        Connection conn = source.getConnection();
    
    获取连接方式2
        Properties prop = new Properties();
        prop.load(new FileReader(配置文件));
        DataSource source = BasicDataSourceFactory.createDataSource(prop);
        Connection conn = source.getConnection();
    
        在配置文件中
        driverClassName=数据库驱动类全名
        url=数据库地址
        username=用户
        password=密码 
        initialSize=初始化连接数  
        maxActive=最大连接数 
        maxIdle=最大空闲连接数 
        minIdle=最小空闲连接数 
        maxWait=超时等待时间(毫秒)  
        defaultAutoCommit=是否自动提交
        defaultTransactionIsolation=事务隔离级别
    

    ②.C3P0数据源

    导入c3p0的jar包
    
    获取连接方式1
        ComboPooledDataSource source = new ComboPooledDataSource();
        source.setDriverClass(数据库驱动类全名);
        source.setJdbcUrl(数据库地址);
        source.setUser(用户);
        source.setPassword(密码);
        Connection conn = source.getConnection();
    
    获取连接方式2 
        // 自动加载位于类加载目录下c3p0-config.xml配置文件
        ComboPooledDataSource source = new ComboPooledDataSource();
        Connection conn = source.getConnection();
        
        在类加载目录下名为c3p0-config.xml配置文件
        <c3p0-config>
            <default-config>
                <property  name="driverClass">数据库驱动类全名</property >
                <property name="jdbcUrl">数据库地址</property >
                <property name="user">用户</property>
                <prope rty name="password">密码</property>
            </default-config>
            <named-config name="mySoruce"> 
                <property name="driverClass">数据库驱动类全名</property >
                <property name="jdbcUrl">数据库地址</property >
                <property name="user">用户</property>
                <property name="password">密码</property>
            </named-config>
        </c3p0-config>      
    

    ③.tomcat内置数据源(DBCP)

    tomcat服务器已经内置了DBCP数据源
    
    1)在Context中配置数据源
        在tomcat/conf/context.xml配置<Context>                 被tomcat所有web应用共享        
        在tomcat/conf/Catalina/主机名/context.xml配置<Context>    被当前虚拟主机所共享  
        
        在tomcat/conf/servler.xml的<Host>标签下配置<Context>   只对当前web应用起作用
        在tomcat/conf/Catalina/主机名/XXXXXX.xml配置<Context> 只对当前web应用起作用        
        在web应用的META-INF目录创建context.xml配置<Context>       只对当前web应用起作用        
                    
    2)在<Cotext>中配置
        <Resource
        name="mySource" 在数据源绑定到jndi容器时使用的名字
        auth="Container" 
        type="javax.sql.DataSource" 当前对象类型
        username=用户名
        password=密码
        driverClassName=数据库驱动类全名
        url=数据库地址
        maxActive=最大连接数
        maxIdle=最大空闲连接数 />
            
    3)在Servlet中获取数据源
        必须在Servlet中执行,才能获取tomcat内置数据源
        Context jndi = (Context) new InitialContext().lookup("java:comp/env");
        DataSource source = (DataSource) jndi.lookup("mySource");       
        Connection conn = source.getConnection();
        
        JNDI(Java Naming and Directory Interface),对应于J2SE的javax.naming包     
        把Java对象放在JNDI容器,为java对象取名,通过名称可检索出对象,
        Context代表JNDI容器,context.lookup方法可检索容器中的对象。
    

    简书: http://www.jianshu.com/p/a0fa35f1899f
    CSDN博客: http://blog.csdn.net/qq_32115439/article/details/54767154
    GitHub博客:http://lioil.win/2017/01/27/JDBC-DataSource.html
    Coding博客:http://c.lioil.win/2017/01/27/JDBC-DataSource.html

    相关文章

      网友评论

          本文标题:JavaEE-JDBC基础-连接池(数据源)

          本文链接:https://www.haomeiwen.com/subject/akevdxtx.html