取得数据库连接是件耗时间及资源的动作,尽量利用已打开的连接,也就是重复利用取得的Connection实例,是改善数据库连接性能的一个方式,而采用连接池是基本做法。由于取得Connection的方式根据所使用的环境及程序需求而有所不同,直接在程序代码中固定(规范)取得Connection的方式并不是明智之举。在Java EE的环境中,将取得连接等与数据库来源相关的行为规范在javax.sql.DataSource接口,实际如何取得Connection则由实现接口的对象来负责。

  为了让应用程序在需要取得某些与系统相关的资源对象时,能与实际的系统资源配置、实体机器位置、环境架构等无关,在Java应用程序中可以通过JNDI(Java Naming Directory Interface)来取得所需的资源对象。如:
  1. try{
  2. Context initContext = new InitialContext();
  3. Context envContext = (Context)initContext.lookup("java:/comp/env");
  4. dataSource = (DataSource)envContext.lookup("jdbc/demo");
  5. }catch(NamingException e){
  6. ...
  7. }

  在创建Context对象的过程中会收集环境的相关数据,之后根据JNDI名称向“jdbc/demo”向JNDI服务器查找DataSource实例并返回。在这个程序片段中,不会知道实际的资源配置、实体机器位置、环境架构等信息,应用程序不会与这些信息相依。如果只是利用JNDI查找某些资源对象,则上面的这个程序片段就是对JNDI需要知道的东西了,其他的细节就交给服务器管理人员做好相关设置,让jdbc/demo可以对应取得DataSource实例即可。

 
示例:
    这里的示例是在Intellij IDEA上,通过创建一个简单web项目来使用DataSource,创建简单的Web应用可以参考:
    这里需要的jar包有:
    · mysql-connector-java-5.1.22-bin.jar
    · jstl-1.1.2.jar
    · standard-1.1.2.jar
    可以在这里:http://cn.jarfire.org/ 下载相关jar包。
 
1)创建一个名为demo的数据库:
    create database demo;
 
2)编写检测数据库是否连接成功的类DatabaseBean:

  1. package com.yyq.bean;
  2. import javax.naming.Context;
  3. import javax.naming.InitialContext;
  4. import javax.naming.NamingException;
  5. import javax.sql.DataSource;
  6. import java.sql.Connection;
  7. import java.sql.SQLException;
  8. import java.util.logging.Level;
  9. import java.util.logging.Logger;
  10. /**
  11. * Created by gao on 16-4-15.
  12. */
  13. public class DatabaseBean {
  14. private DataSource dataSource;
  15. public DatabaseBean(DataSource dataSource) {
  16. this.dataSource = dataSource;
  17. }
  18. public DatabaseBean() {
  19. try {
  20. Context initContext = new InitialContext();
  21. Context envContext = (Context) initContext.lookup("java:/comp/env");
  22. //查找jdbc/demo对应的DataSource对象
  23. dataSource = (DataSource) envContext.lookup("jdbc/demo");
  24. } catch (NamingException ex) {
  25. Logger.getLogger(DatabaseBean.class.getName()).log(Level.SEVERE, null, ex);
  26. throw new RuntimeException(ex);
  27. }
  28. }
  29. public boolean isConnectedOK() {
  30. boolean ok = false;
  31. Connection conn = null;
  32. try {
  33. //通过DataSource对象取得连接
  34. conn = dataSource.getConnection();
  35. if (!conn.isClosed()) {
  36. ok = true;
  37. }
  38. } catch (SQLException ex) {
  39. Logger.getLogger(DatabaseBean.class.getName()).log(Level.SEVERE, null, ex);
  40. throw new RuntimeException(ex);
  41. } finally {
  42. if (conn != null) {
  43. try {
  44. conn.close();
  45. } catch (SQLException ex) {
  46. Logger.getLogger(DatabaseBean.class.getName()).log(Level.SEVERE, null, ex);
  47. }
  48. }
  49. }
  50. return ok;
  51. }
  52. }
 
3)在WEB-INF/web.xml文件中设置数据源所对应的JNDI名称:
    在上面的代码中无法确定使用了哪个驱动程序,数据块用户名、密码是什么,数据库实体地址、连接端口、名称、是否使用了连接池等。这些都是由数据库管理人员或服务器管理人员负责设置,而这里需要知道的就是jdbc/demo这个JNDI名称,并且要将这个告诉Web容器,也就是要在web.xml中设置。
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://java.sun.com/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  5. http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  6. version="3.0">
  7. <resource-ref>
  8. <res-ref-name>jdbc/demo</res-ref-name>
  9. <res-type>javax.sql.DataSource</res-type>
  10. <res-auth>Container</res-auth>
  11. <res-sharing-scope>Shareable</res-sharing-scope>
  12. </resource-ref>
  13. </web-app>

4)编写简单的JSP来使用DatabaseBean,检测数据库是否连接成功。

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
  3. <jsp:useBean id = "db" class="com.yyq.bean.DatabaseBean"/>
  4. <!DOCTYRE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <title>测试数据库连接</title>
  8. </head>
  9. <body>
  10. <c:choose>
  11. <c:when test="${db.connectedOK}">连接成功!</c:when>
  12. <c:otherwise>连接失败!</c:otherwise>
  13. </c:choose>
  14. </body>
  15. </html>
5)在Tomcat容器中配置context.xml文件
    就一个Java开发人员来说,以上的工作就算完成了,但是现在需要连接数据库,因此还需要设置JNDI相关资源,但设置的方式并非标准的一部分,而是依应用程序服务器而有所不同,假设应用程序将部署在Tomcat7上,在Tomcat7安装目录下的conf/context.xml添加资源配置。
    如路径:C:\apache-tomcat-7.0.68\conf\context.xml

  1. <?xml version='1.0' encoding='utf-8'?>
  2. <Context>
  3. <WatchedResource>WEB-INF/web.xml</WatchedResource>
  4.  
  5. <Resource name="jdbc/demo" auth="Container"
  6. type = "javax.sql.DataSource" maxActive = "20" maxIdle="10"
  7. maxWait="10000" username="root" password="123456"
  8. driverClassName = "com.mysql.jdbc.Driver"
  9. url="jdbc:mysql://localhost:3306/demo?">
  10. </Resource>
  11.  
  12. </Context>
主要是添加<Resource></Resource>部分。
其中:
name: 表示指定的jndi名称
auth :表示认证方式,一般为Container
type :表示数据源床型,使用标准的javax.sql.DataSource
maxActive: 表示连接池当中最大的数据库连接
maxIdle :表示最大的空闲连接数
maxWait :当池的数据库连接已经被占用的时候,最大等待时间
username :表示数据库用户名
password :表示数据库用户的密码
driverClassName: 表示JDBC DRIVER
url :表示数据库URL地址
 
注意:url中是用来设置JDBC URL的,因为是编写在XML文件中,如果在url中需要加入useUnicode和characterEncoding,则需要将 & 用 &amp; 替代,即:
将 url = "jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=UTF-8"  转换成 
url = "jdbc:mysql://localhost:3306/demo?useUnicode=true&amp;characterEncoding=UTF-8"
 
6)配置Tomcat,并启动即可。
 
 
 
参考:http://www.blogjava.net/ytl-zlq/archive/2009/04/14/265564.html
 
 

JDBC学习总结(五)的更多相关文章

  1. jdbc学习总结

    jdbc学习总结:   一.简介: jdbc,直译为java连接数据库.实际为java为很好的操作数据库而提供的一套接口,接口的实现(即驱动)由各个数据库厂商提供.   二.知识要点: 连接5要素,3 ...

  2. spring 学习(五):spring 事务

    spring 学习(五):spring 事务 事务概要 一个数据库事务通常包含了一个序列的对数据库的读/写操作.它的存在包含有以下两个目的: 为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同 ...

  3. 从零开始学习jQuery (五) 事件与事件对象

    本系列文章导航 从零开始学习jQuery (五) 事件与事件对象 一.摘要 事件是脚本编程的灵魂. 所以本章内容也是jQuery学习的重点. 本文将对jQuery中的事件处理以及事件对象进行详细的讲解 ...

  4. 前端学习 第五弹: CSS (一)

    前端学习 第五弹: CSS (一) 创建css: <link rel="stylesheet" type="text/css" href="my ...

  5. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

  6. Android Animation学习(五) ApiDemos解析:容器布局动画 LayoutTransition

    Android Animation学习(五) ApiDemos解析:容器布局动画 LayoutTransition Property animation系统还提供了对ViewGroup中的View改变 ...

  7. 六、Android学习第五天——Handler的使用(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 六.Android学习第五天——Handler的使用 注意:有很多功能是不 ...

  8. JDBC学习笔记(2)——Statement和ResultSet

    Statement执行更新操作 Statement:Statement 是 Java 执行数据库操作的一个重要方法,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句.Statement ...

  9. JDBC学习笔记(1)——JDBC概述

    JDBC JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据.JDBC代表Java数据库连接. JDBC库中所包含的API任务通常与数据库使用: 连接到数 ...

随机推荐

  1. thinkpad t440p 解决无线网卡驱动

    $ wget https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1239578/+attachment/4057550/+files/rtl_9 ...

  2. WPF之旅(三)- 布局之StackPanel

    说到WPF的界面布局,相信很多朋友都写过Html代码.在WPF中,大多数程序都使用类似Web的(flow)流布局.在使用流布局模型时,各种控件可以按特定的要求来排列,在窗口内容发生变化时,比如窗口大小 ...

  3. TQ2440开发板网络配置方式

    一.命令行模式 1.设置IP.子网掩码(netmask) #ifconfig eth0 <IP地址> netmask <子网掩码> up up 表示开启网卡eth0,可以不加 ...

  4. .NET4.5中WCF中默认生成的basicHttpsBinding的研究

    起因: 使用.net4.5建立了一个空白的WCF服务.默认使用的绑定配置是basicHttpsBinding. 问题发现: 1.用客户端进行服务引用,生成了默认的配置文件,其中绑定配置是basicHt ...

  5. 面试问到的Spring

    一.介绍Spring 1.主要使用了基本的javabean代替的Ejb  Ejb:服务端的组件模型,设计目标应用部署分布在应用程序,把已经做好的编好的程序,打包放在服务 端执行,凭借java跨平台的优 ...

  6. android中实现Parcelable序列化步骤

    import java.io.Serializable; import java.text.DecimalFormat; import android.os.Parcel; import androi ...

  7. cadence16.6 中orcad导出网表时ERROR (ORCAP-5004)

    ORCAD网表输出时 ERROR (ORCAP-5004):Error  initializing COM  property   pages 之前遇到过这个问题,解决后忘了记录下来了.依稀记得问题答 ...

  8. NopCommerce——Web层中的布局页

    援引上一篇文章关于nopcommerce源代码结构的翻译:“Nop.Web也是一个MVC Web应用程序项目,一个公有区域的展示层.它就是你实际能够运行的应用程序.它是应用程序的启动项目”.对于nop ...

  9. 手写SqlHelper

    SqlHelper是一个基于.NET Framework的数据库操作组件.组件中包含数据库操作方法,SqlHelper有很多版本,主要以微软一开始发布的SqlHelper类,后面包含进了Enterpr ...

  10. PythonChallenge 2:爬虫和正则表达式

    题目: 解题思路:题目里已经说的很清楚了,字符可能在网页的源代码里.右键查看网页源代码,发现其中有一段:find rare characters in the mess below.有些人是直接把下面 ...