zoukankan      html  css  js  c++  java
  • 数据库连接池

    数据库连接池
    当没有使用数据库连接池的时候应用程序直接获取链接,用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机。
    连接池原理:
    在服务器端一次性创建多个多个连接,将多个连接保存在一个连接池对象中,当请求需要操作数据库时,不会请求创建新的连接,而是直接从连接池中获得一个连接,操作数据库结束,并不需要真正关闭连接,而是将连接放回到连接池,在连接池使用饱和时,多余的请求会进入队列等待连接的释放。

    编写连接池需要实现javax.sql.DataSource接口
    DataSource接口中定义了两个重载的getConnection方法:
    Connection getConnection()
    Connection getConnection(String?username, String?password) 实现DataSource接口,并实现连接池功能的步骤:在DataSource构造函数中批量创建与数据库的连接,并把创建的连接保存到一个集合对象中 实现getConnection方法,让getConnection方法每次调用时,从集合对象中取一个Connection返回给用户。 当用户使用完Connection,调用Connection.close()方法时,Collection对象应保证将自己返回到连接池的集合对象中,而不要把conn还给数据库。

    java增强原有方法的三种途径
    1,继承复写,必须控制对象的创建,
    2,装饰模式,前提装饰类与被装饰类必须实现同一个接口或者继承同一个父类。装饰类构造函数参数接收被装饰类对象
    3,动态代理,进行方法增强的最常用模式,较为灵活,根据源对象在内存中构造一个代理对象,源对象所有方法都将执行代理对象invoke方法。

    在实际开发中并不会要求自己编写数据库连接池,会使用一些开源免费的数据库连接池。
    Apache commins-dpcp连接池
    将dpcp和pool的jar包复制在web-inf下的lib目录进行导包

    1,创建连接池使用BasicDataSource核心类,
    BasicDataSource basicDataSource= new BasicDataSource();
    2,连接池中创建连接
    basicDataSource.setDriverClassName("");
    basicDataSource.setUrl("");
    basicDataSource.setUserNmae("");
    basicDataSource.setPassword("");
    3,从连接池中获取连接
    Connection conn=basicDataSource.getConnection();


    从这里可以看出开源数据库连接池的使用并没有简化代码,但是在内部实现时优化了性能。
    继续增加扩展性可以将参数写入配置文件并编写utils工具类。
    参数配置文件读取方式

    Properties properties=new Properties();
    properties.load(new FileInputStream(this.getClass().getResource("url").getFile()));
    DataSource basicDataSource=BasicDataSourceFactory.createDataSource(properties);

    c3p0 数据库连接池的使用此处不深入学习
    Tomact内部提供的数据库连接池
    tomact内部连接池就是dbcp
    Tomcat并不支持所有的JavaEE规范,要使用内置的dbcp需要通过JNDI技术

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


    1,在tomcat安装目录/conf/context.xml中进行配置对tomcat内部所有虚拟主机中任何工程都有效
    2,在tomcat安装目录/comfig/Catalina/虚拟主机目录/context.xml配置对当前虚拟主机任何工程都有效
    3, 在web工程根目录/meta-inf/context.xml配置只对当前工程有效。
    用JNDI访问连接池原理
    1,将一个java 对象,绑定在JNDI容器中,为java对象起一个名字
    2,java程序通过名字检索到该对象并调用。
    访问具体过程
    1,配置context文件
    2,tomcat启动时自动加载配置文件,根据配置文件创建连接池
    3,为连接池对象绑定名称
    4,通过名称检索访问被绑定对象
    核心APIContext,javax.naming.Context接口。
    注意事项
    1,tomcat连接数据库,而非自己工程连接数据库,所以需要将驱动jar包复制在tomcat/lib目录下
    2,Java程序通过JNDI访问对象----该java程序必须运行在同一个JDNI容器中,所以该java程序通常是Servle或者Jsp等运行在tomcat内部的程序。

    //创建检索对象
    Context initCtx=new InitialContext();
    //默认查找顶级java名称串,固定为"java:comp/env"
    Context envCtx=(Context)initCtx.lookup("java:comp/env");
    //根据名称设置查找连接池对象
    DataSource ds=(DataSource)envCtx.lookup("jdbc/TestDB");
    //或得连接池中的一个连接
    Connection conn=ds.getConnection();
  • 相关阅读:
    bzoj4513: [Sdoi2016]储能表
    bzoj4000: [TJOI2015]棋盘
    bzoj3067: Hyperdrome
    bzoj4943: [Noi2017]蚯蚓
    bzoj4044: [Cerc2014] Virus synthesis
    bzoj3676: [Apio2014]回文串
    bzoj4543: [POI2014]Hotel加强版
    bzoj1921: [Ctsc2010]珠宝商
    bzoj4754: [Jsoi2016]独特的树叶
    作图的配色
  • 原文地址:https://www.cnblogs.com/ss561/p/4645584.html
Copyright © 2011-2022 走看看