方立勋_30天掌握JavaWeb_JDBC、连接池、JNDI(三)_Jaybo_的博客-程序员秘密

技术标签: 数据库连接池  jdbc  JAVA后端笔记  数据库  后端 [方立勋30天掌握JavaWeb学习]  

使用数据库连接池优化程序性能

这里写图片描述

缺点:用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机。

使用连接池:

这里写图片描述

编写数据库连接池

  • 编写连接池需实现java.sql.DataSource接口。DataSource接口中定义了两个重载的getConnection方法:
    Connection getConnection()
    Connection getConnection(String username, String password)

  • 实现DataSource接口,并实现连接池功能的步骤:

    • 在DataSource构造函数中批量创建与数据库的连接,并把创建的连接加入LinkedList对象中。
    • 实现getConnection方法,让getConnection方法每次调用时,从LinkedList中取一个Connection返回给用户。
    • 当用户使用完Connection,调用Connection.close()方法时,Collection对象应保证将自己返回到LinkedList中,而不要把conn还给数据库。
    • Collection保证将自己返回到LinkedList中是此处编程的难点。

一般有三种方式:
1. 写一个connection子类,覆盖close方法,增强close方法
2. 用包装设计模式
3. 用动态代理

使用动态代理技术构建连接池中的connection

proxyConn = (Connection) Proxy.newProxyInstance(this.getClass()
            .getClassLoader(), conn.getClass().getInterfaces(),
            new InvocationHandler() {
        //此处为内部类,当close方法被调用时将conn还回池中,其它方法直接执行
            public Object invoke(Object proxy, Method method,
                    Object[] args) throws Throwable {
                if (method.getName().equals("close")) {
                    pool.addLast(conn);
                    return null;
            }
            return method.invoke(conn, args);
        }
    });

开源数据库连接池

  • 现在很多WEB服务器(Weblogic, WebSphere, Tomcat)都提供了DataSoruce的实现,即连接池的实现。通常我们把DataSource的实现,按其英文含义称之为数据源,数据源中都包含了数据库连接池的实现。
  • 也有一些开源组织提供了数据源的独立实现:
    • DBCP 数据库连接池
    • C3P0 数据库连接池
  • 实际应用时不需要编写连接数据库代码,直接从数据源获得数据库的连接。程序员编程时也应尽量使用这些数据源的实现,以提升程序的数据库访问性能。

DBCP数据源

  • DBCP 是 Apache 软件基金组织下的开源连接池实现,使用DBCP数据源,应用程序应在系统中增加如下两个 jar 文件:
    • Commons-dbcp.jar:连接池的实现
    • Commons-pool.jar:连接池实现的依赖库
  • Tomcat 的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。

使用DBCP示例代码:

static{
    InputStream in = JdbcUtil.class.getClassLoader().
            getResourceAsStream("dbcpconfig.properties");
    Properties prop = new Properties();
    prop.load(in);

    BasicDataSourceFactory factory = new BasicDataSourceFactory();
    dataSource = factory.createDataSource(prop);
}

C3P0 数据源

这里写图片描述

配置Tomcat数据源

查看Tomcat文档,示例代码:

<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>
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
dataSource = (DataSource)envCtx.lookup("jdbc/datasource");

特别提醒:此种配置下,驱动jar文件需放置在tomcat的lib下

JNDI技术简介

  • JNDI(Java Naming and Directory Interface),Java命名和目录接口,它对应于J2SE中的javax.naming包,
  • 这套API的主要作用在于:它可以把Java对象放在一个容器中(JNDI容器),并为容器中的java对象取一个名称,以后程序想获得Java对象,只需通过名称检索即可。
  • 其核心API为Context,它代表JNDI容器,其lookup方法为检索容器中对应名称的对象。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u012195214/article/details/70199207

智能推荐

IDEA搭建SpringBoot并实现简单数据库操作_FENGYU406的博客-程序员秘密

文章目录前言IDEA搭建SpringBoot新建项目配置及启动配置启动简单功能的实现页面输出文本或返回JSON跳转模板(templates文件夹下的HTML)实现JPA增删查改数据库表创建实体类Dao查询接口控制器方法HTML模板页面效果展示坑和知识点前言此文章讲解使用IDEA搭建SpringBoot项目,并实现简单的增删查改功能,在搭建过程中遇到了很多坑。SpringBoot真的是非常的简...

[pwn]堆:堆风水与堆排布-babyfengshui_breezeO_o的博客-程序员秘密

[pwn]堆:堆风水与堆排布-babyfengshui所谓堆风水也叫作堆排布,其实说严格了并不是一种漏洞的利用方法,而是一种灵活布置堆块来控制堆布局的方法,在一些一些其他漏洞的利用中起到效果。通过一道经典的题目,由清华蓝莲花战队出的babyfengshui来看一下:babyfengshui查看安全策略没开PIE,但值得一提的是这是一个32位的程序,32位的堆是4字节对齐的。查看程序逻辑...

Ubuntu上安装samba不能安装的问题,“下列的软件包有不能满足的依赖关系”_Huang_X_X的博客-程序员秘密

[email protected]:~# apt-get install samba正在读取软件包列表… 完成正在分析软件包的依赖关系树       正在读取状态信息… 完成       有一些软件包无法被安装。如果您用的是不稳定(unstable)发行版,这也许是因为系统无法达到您要求的状态造成的。该版本中可能会有一些您需要的软件包尚未被创建或是它们还在新到(incoming)目录中

Redis高频面试笔记:java对象集合排序_始飞龙的博客-程序员秘密

珍藏版(1)——Mybatis入门1.什么是MyBatis2.为什么我们要用Mybatis?3.Mybatis快速入门3.1 导入开发包3.2准备测试工作3.3 创建mybatis配置文件3.4 编写工具类测试是否获取到连接3.5 创建实体与映射关系文件3.6 编写DAO4.Mybatis工作流程5.完成CRUD操作5.1 增加学生5.2 根据ID查询数据5.3 查询所有数据5.4 根据id删除5.5 修改5.6 小细节

java优先队列的入队函数,算法与数据结构番外(1):优先队列_刘秩的博客-程序员秘密

这是算法与数据结构番外系列的第一篇,这个系列未来的主要内容是补充一些与算法与数据结构相关的知识,这些知识比较零碎,同时也与正传关系密切,往往需要阅读了正传的相关内容以后,才能较好的理解这部分内容。如果对番外系列不感兴趣的话,是可以跳过此系列内容的,不会影响理解其他文章的内容。阅读本文前,需要首先了解队列和堆的相关知识。此文优先队列的代码可以在我的 github 上查看。优先队列优先队列是一种特殊的...

python读取每一行存入数组_python把文件中的每一行以数组的元素放入数组中的方法..._小地球旅行的博客-程序员秘密

这篇文章主要介绍了关于python 把文件中的每一行以数组的元素放入数组中的方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下有时候需要把文件中的数据放入到数组中,这里提供了一种方法,可以根据文件结尾的标记进行数据拆分,然后再把拆分的文件放入数组中# -*-coding: utf-8 -*-f = open("username.txt","w")f.write("Lycoridia...

随便推点

iTOP6818——针对ubuntu系统的双屏异显kernel配置_会跑的火车的博客-程序员秘密

引言iTOP6818是8核嵌入式开发平台,在ubuntu系统下可以设置触摸屏显示或HDMI显示,但官方并没有做对应的双屏异显,即触摸屏和HDMI显示不同的画面。基于个人需求,本人完成了该功能配置,现将配置方法说明如下。资料下载配置思路在内核中重新创建一个fb节点来挂载HDMI设备,主设备触摸屏为fb0,次设备HDMI为fb1,通过修改内核驱动代码可以实现双屏异显。配置方法...

Linux下查看Raid磁盘阵列信息的方法_u011057424的博客-程序员秘密

Linux下查看软、硬raid信息的方法软件raid:只能通过Linux系统本身来查看cat /proc/mdstat可以看到raid级别,状态等信息。硬件raid: 最佳的办法是通过已安装的raid厂商的管理工具来查看,有cmdline,也有图形界面。如Adaptec公司的硬件卡就可以通过下面的命令进行查看:# /usr/dpt/raidutil -L a

mdx文件转换成html,MDX/MDD 文件格式解析_当年流水的博客-程序员秘密

MDict 将字典定义(关键字,解释)放在 MDX 文件中,字典相关的其他资源样式文件,比如图片,发音,样式放在 MDD 文件中,虽然存放的内容是不一样的,但是两种文件的结构是一致的。源文件格式MDict 的 html 格式每个项目两行第一行是关键字第二行开始是正文,这里的正文应该包括关键字。可以使用 html 的标记(不要包含) , 这个程序会自动加上,另注意在转换时要指明源数据为 html)....

kali linux安装wine32,永恒之蓝msf下 ms17_010 (64位kali下安装wine32)_我是公务员的博客-程序员秘密

本次用到的环境:kali(2016.2)32位系统.ip地址:192.168.1.104目标靶机为:win7sp1x64系统(关闭防火墙),ip地址:192.168.1.105=================================若kali为64位windows为32需要安装wine32 ,但64位的kali下无法apt-get install wine32在执行exploit时会出现...

Python 实现最长公共子串&最长公共子序列(LCS)_python最长公共子串忽略空格_zwglory的博客-程序员秘密

最长公共子串 (The Longest Common Substring)参考自:https://blog.csdn.net/wateryouyo/article/details/50917812LCS问题就是求两个字符串最长公共子串的问题。解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长的1的序列,其对应的位置就是最长匹配...

asprotect脱壳经验谈_asprotect v1.32 [overlay] *_joeleechj的博客-程序员秘密

数月前对某一程序分析,拿到程序应PEid扫描了一下,发现是asp 的壳,之前脱过此类壳感觉难度不大,此程序在OEP调用了GetStartupInfo,找到OEP并不困难,结合堆栈基本就可以确定OEP。然后开始用ollydump dump程序,importrec修复,一切顺利。    好了,开始运行脱壳后的程序,程序开始处理,显示进度条。在这时本人喜悦不胜言表,就等着开始自己的探索之旅,突然我w

推荐文章

热门文章

相关标签