数据库连接池
当没有使用数据库连接池的时候应用程序直接获取链接,用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天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();