数据库连接池
当没有使用数据库连接池的时候应用程序直接获取链接,用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天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内部连接池就是dbcpTomcat并不支持所有的JavaEE规范,要使用内置的dbcp需要通过JNDI技术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();