0.引言

许多Web应用程序需要通过JDBC驱动程序访问数据库,以支持该应用程序所需的功能。Java EE平台规范要求Java EE应用程序服务器为此目的提供一个DataSource实现(即,用于JDBC连接的连接池)。Tomcat提供了完全相同的支持,因此使用此服务在Tomcat上开发的基于数据库的应用程序将在任何Java EE服务器上保持不变。

有关JDBC的信息,请参考以下内容:

 - Tomcat中的默认数据源支持基于Commons 项目中的DBCP连接池 。然而,也可以使用实现任何其他连接池,通过编写自己的自定义资源工厂,描述 如下javax.sql.DataSource

1.安装JDBC驱动程序

使用JDBC数据源 JNDI资源工厂要求您为Tomcat内部类和Web应用程序提供适当的JDBC驱动程序。这很容易通过将驱动程序的JAR文件安装到 WEB-INF/lib目录中来完成,这使得驱动程序既可用于资源工厂,也可用于您的应用程序。

2.声明您的资源要求

接下来,修改Web应用程序部署描述符(/WEB-INF/web.xml)以声明JNDI名称,您将在其中查找预配置的数据源。按照惯例,所有这样的名字都应该解析为jdbc子上下文(相对于作为java:comp/env所有提供的资源工厂的根的标准命名上下文来说,典型的web.xml入口可能是这样的:

<!--官网配置内容-->

<resource-ref>
<description>
Resource reference to a factory for java.sql.Connection
instances that may be used for talking to a particular
database that is configured in the <Context>
configuration for the web application.
</description>
<res-ref-name>
jdbc/EmployeeDB
</res-ref-name>
<res-type>
javax.sql.DataSource
</res-type>
<res-auth>
Container
</res-auth>
</resource-ref> <!--下面是我自己MySQL的配置内容-->
<resource-ref>
<description>
使用DataSource为jdbc/news创建新的数据源
</description>
<res-ref-name>
jdbc/news
</res-ref-name>
<res-type>
javax.sql.DataSource
</res-type>
<res-auth>
Container
</res-auth>
</resource-ref>

警告 - 请确保您遵守DTD为Web应用程序部署描述符所需的元素排序!有关详细信息,请参阅 Servlet规范

3.编写你的应用程序使用这个资源

此资源引用的典型用法可能如下所示:

//获取Context实例
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env/jdbn/news"); //java:comp/env/名后加上你自己的命名

DataSource ds = (DataSource) envCtx.lookup("jdbc/EmployeeDB"); //这样直接就可以获得了数据库连接了 
Connection conn = ds.getConnection(); ... use this connection to access the database ... conn.close();

请注意,应用程序使用在Web应用程序部署描述符中声明的相同的资源引用名称。这与<Context>Web应用程序的元素中配置的资源工厂相匹配, 如下所述。

4.配置Tomcat的资源工厂

要配置Tomcat的资源工厂,请将这样的元素添加到<Context>Web应用程序的 元素中。

<!--官网配置内容-->

<Context ...>
...
<Resource name="jdbc/EmployeeDB"
auth="Container"
type="javax.sql.DataSource"
username="dbusername"
password="dbpassword"
driverClassName="org.hsql.jdbcDriver"
url="jdbc:HypersonicSQL:database"
maxActive="8"
maxIdle="4"/>
...
</Context> <!--下面是我自己的MySQL配置内容-->
<Resource name="jdbc/news"
      auth="Container"
      type="javax.sql.DataSource"
      username="root"
      password="1992121niu"
      driverClassName="com.mysql.jdbc.Driver"
      url="jdbc:mysql://localhost:3306/news"
      maxActive="100"
      maxIdle="30"
      maxWaite="10000"/>

请注意,资源名称(此处jdbc/EmployeeDB)必须与Web应用程序部署描述符中指定的值相匹配。

此示例假定您正在使用HypersonicSQL(我使用的是MySQL数据库)数据库JDBC驱动程序。自定义driverClassName和 driverName参数以匹配您的实际数据库的JDBC驱动程序和连接URL。

Tomcat标准数据源资源工厂(org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory)的配置属性如下所示:

  • driverClassName - 要使用的JDBC驱动程序的完全限定Java类名称。

  • username - 要传递给我们的JDBC驱动程序的数据库用户名。

  • password - 数据库密码被传递给我们的JDBC驱动程序。

  • url - 要传递给我们的JDBC驱动程序的连接URL。(为了向后兼容,该属性driverName 也被认可。)

  • initialSize - 池初始化期间将在池中创建的初始连接数。默认值:0

  • maxActive - 可同时从该池中分配的最大连接数。默认:8

  • minIdle - 同时在此池中闲置的最少连接数。默认值:0

  • maxIdle - 可同时在此池中闲置的最大连接数。默认:8

  • maxWait - 池在抛出异常之前等待的最大毫秒数(当没有可用的连接时)。默认值:-1(无限)

一些额外的属性处理连接验证:

  • validationQuery - SQL查询,可以在池返回到应用程序之前用于验证连接。如果指定,这个查询必须是一个返回至少一行的SQL SELECT语句。

  • validationQueryTimeout - 验证查询返回的超时秒数。默认值:-1(无限)

  • testOnBorrow - true或false:每次从池中借用验证查询是否验证连接。默认值:true

  • testOnReturn - true或false:是否每次将连接返回到池时使用验证查询验证连接。默认:false

可选的evictor线程负责通过移除任何长时间处于空闲状态的连接来缩小池。退伍军人不尊重minIdle。请注意,如果您只希望池根据配置的maxIdle属性收缩,则不需要激活evictor线程。

evictor在默认情况下是禁用的,可以使用以下属性进行配置:

  • timeBetweenEvictionRunsMillis - 逐出器连续运行之间的毫秒数。默认值:-1(禁用)

  • numTestsPerEvictionRun - 在逐出器的每次运行期间将由检出器检查空闲的连接数。默认:3

  • minEvictableIdleTimeMillis - 以秒为单位的空闲时间,在该时间之后,可以通过逐出器从池中删除连接。默认值:30 * 60 * 1000(30分钟)

  • testWhileIdle - true或者false:连接是否应该由evictor线程在池中闲置时使用验证查询进行验证。默认:false

另一个可选功能是删除废弃的连接。如果应用程序长时间未将其返回到池,则称该连接被放弃。游泳池可以自动关闭此类连接并将其从游泳池中移除。这是泄露连接的应用程序的解决方法。

放弃功能默认是禁用的,可以使用以下属性进行配置:

  • removeAbandoned - true或false:是否从池中删除放弃的连接。默认:false

  • removeAbandonedTimeout - 假定借用连接被放弃的秒数。默认值:300

  • logAbandoned - true或false:是否为放弃语句或连接的应用程序代码记录堆栈跟踪。这增加了严重的开销。默认:false

最后有各种属性可以进一步调整池的行为:

  • defaultAutoCommit - true或false:由此池创建的连接的默认自动提交状态。默认值:true

  • defaultReadOnly - true或false:由此池创建的连接的默认只读状态。默认:false

  • defaultTransactionIsolation - 这设置默认事务隔离级别。可以是一个 NONEREAD_COMMITTED, READ_UNCOMMITTEDREPEATABLE_READSERIALIZABLE。默认:没有默认设置

  • poolPreparedStatements - true或false:是否要池PreparedStatements和CallableStatements。默认:false

  • maxOpenPreparedStatements - 可以从语句池同时分配的最大打开语句数。默认值:-1(无限制)

  • defaultCatalog - 默认目录的名称。默认:未设置

  • connectionInitSqls - 在创建连接后运行一次SQL语句。用分号(;)分隔多个语句。默认:没有语句

  • connectionProperties - 传递给驱动程序以创建连接的驱动程序特定属性的列表。每个属性都给定为name=value,多个属性用分号(;)分隔。默认值:没有属性

  • accessToUnderlyingConnectionAllowed - true或false:是否允许访问基础连接。默认:false

*Myeclipes下使用

  在myeclipes下使用可以不用配置web.xml直接将context.xml放入WebRoot的META-INF文件即可

  如图:

JDBC数据源 使用JNDI连接池实现数据库的连接的更多相关文章

  1. JDBC实例--JDBC连接池技术解密,连接池对我们不再陌生

    一.为什么我们要用连接池技术? 前面的数据库连接的建立及关闭资源的方法有些缺陷.统舱传统数据库访问方式:一次数据库访问对应一个物理连接,每次操作数据库都要打开.关闭该物理连接, 系统性能严重受损. 解 ...

  2. JDBC连接池原理、自定义连接池代码实现

    首先自己实现一个简单的连接池: 数据准备: CREATE DATABASE mybase; USE mybase; CREATE TABLE users( uid INT PRIMARY KEY AU ...

  3. Java 使用 DBCP mysql 连接池 做数据库操作

    需要的jar包有 commons-dbutils , commons-dbcp , commons-pool , mysql-connector-java 本地database.propertties ...

  4. druid连接池获取不到连接的一种情况

    数据源一开始配置: jdbc.initialSize=1jdbc.minIdle=1jdbc.maxActive=5 程序运行一段时间后,执行查询抛如下异常: exception=org.mybati ...

  5. 为什么要用Jedis连接池+浅谈jedis连接池使用

    为什么要使用Jedis连接池 Redis作为缓存数据库理论上和MySQL一样需要客户端和服务端建立起来连接进行相关操作,使用MySQL的时候相信大家都会使用一款开源的连接池,例如C3P0.因为直连会消 ...

  6. C# 连接池开发,多连接高效应用开发,多连接自动维护管理。

    本文将使用一个Github开源的组件库技术来实现连接池的操作,应用于一些情况下的频繁的网络连接操作. github地址:https://github.com/dathlin/HslCommunicat ...

  7. jdbc连接池c3p0/dbcp强制连接超过设置时间后失效

    通常来说,各种技术实现的优化参数或者选项或者歪门邪道之所以能被想出来,通常是因为开发者或者实现的贡献者曾经遇到过导致此结果的问题,所以才出了对应的策略选项. 在有些情况下,比如存在客户端或者服务端连接 ...

  8. 将数据库dbcp连接池改为c3p0连接池(草稿,别点)

    D:\Develop\apache-tomcat-7.0.52\bin\catalina.bat run[2017-12-26 02:31:29,174] Artifact pers:war expl ...

  9. 阶段3 1.Mybatis_07.Mybatis的连接池及事务_2 连接池介绍

随机推荐

  1. php使用curl下载指定大小的文件

    php中使用基于libcurl的curl函数,可以对目标url发起http请求并获取返回的响应内容.通常的请求方式类似如下的代码: public function callFunction($url, ...

  2. WPF Popup全屏 弹出方法。解决只显示75%的问题。

    WPF Popup全屏 弹出方法.解决只显示75%的问题.   WPF 中 Popup 有一个特点.当Popup的高度超过屏幕的75%的时候,只显示75%的高度. 如下代码: <Window x ...

  3. GPUImage库的使用

    GPUImage开源项目地址:https://github.com/BradLarson/GPUImage GPUImage使用说明:https://github.com/BradLarson/GPU ...

  4. jenkins、ant、selenium、testng搭建自动化测试框架

    如果在你的理解中自动化测试就是在eclipse里面讲webdriver的包引入,然后写一些测试脚本,这就是你所说的自动化测试,其实这个还不能算是真正的自动化测试,你见过每次需要运行的时候还需要打开ec ...

  5. AlexNet 网络详解及Tensorflow实现源码

    版权声明:本文为博主原创文章,未经博主允许不得转载. 1. 图片数据处理 2. 卷积神经网络 2.1. 卷积层 2.2. 池化层 2.3. 全链层 3. AlexNet 4. 用Tensorflow搭 ...

  6. win10 uwp 读写XML

    UWP 对 读写 XML做了一些修改,但和之前 WPF 的方法没有大的区别. 我们先来说下什么是 XML , XML 其实是 树结构,可以表达复杂的结构,所以在定制要求高的.或其他方面如json 做不 ...

  7. C# 使用HtmlAgilityPack抓取网页信息

    前几天看到一篇博文:C# 爬虫 抓取小说 博主使用的是正则表达式获取小说的名字.目录以及内容. 下面使用HtmlAgilityPack来改写原博主的代码 在使用HtmlAgilityPack之前,可以 ...

  8. 清空jQuery validation 显示的错误信息

    现在做个BS结构的查询系统,登陆的时候添加个重置的按钮. 他的功能主要是: 1.清空Input的text 2.jQuery validation插件当错误的时候显示的信息,解决方法如下面的代码 var ...

  9. Express+Mongoose(MongoDB)+Vue2全栈微信商城项目全记录

    最近用vue2做了一个微信商城项目,因为做的比较仓促,所以一边写一下整个流程,一边稍做优化. 项目github地址:https://github.com/seven9115/vue-fullstack ...

  10. Java基础总结--方法(函数)

    ---函数的作用---实现特定功能的代码--是一种代码重用的方式---函数的格式---访问修饰符 返回值类型 函数名(参数列表){语句:} 参数列表包含参数的类型和参数名(参数列表要注意顺序)---关 ...