zoukankan      html  css  js  c++  java
  • JDBC学习总结(五)

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

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

      在创建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:
    package com.yyq.bean;
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import javax.sql.DataSource;
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    /**
     * Created by gao on 16-4-15.
     */
    public class DatabaseBean {
        private DataSource dataSource;
        public DatabaseBean(DataSource dataSource) {
            this.dataSource = dataSource;
        }
        public DatabaseBean() {
            try {
                Context initContext = new InitialContext();
                Context envContext = (Context) initContext.lookup("java:/comp/env");
                //查找jdbc/demo对应的DataSource对象
                dataSource = (DataSource) envContext.lookup("jdbc/demo");
            } catch (NamingException ex) {
                Logger.getLogger(DatabaseBean.class.getName()).log(Level.SEVERE, null, ex);
                throw new RuntimeException(ex);
            }
        }
        public boolean isConnectedOK() {
            boolean ok = false;
            Connection conn = null;
            try {
                //通过DataSource对象取得连接
                conn = dataSource.getConnection();
                if (!conn.isClosed()) {
                    ok = true;
                }
            } catch (SQLException ex) {
                Logger.getLogger(DatabaseBean.class.getName()).log(Level.SEVERE, null, ex);
                throw new RuntimeException(ex);
            } finally {
                if (conn != null) {
                    try {
                        conn.close();
                    } catch (SQLException ex) {
                        Logger.getLogger(DatabaseBean.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
            return ok;
        }
    }
     
    3)在WEB-INF/web.xml文件中设置数据源所对应的JNDI名称:
        在上面的代码中无法确定使用了哪个驱动程序,数据块用户名、密码是什么,数据库实体地址、连接端口、名称、是否使用了连接池等。这些都是由数据库管理人员或服务器管理人员负责设置,而这里需要知道的就是jdbc/demo这个JNDI名称,并且要将这个告诉Web容器,也就是要在web.xml中设置。
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
              http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
               version="3.0">
        <resource-ref>
            <res-ref-name>jdbc/demo</res-ref-name>
            <res-type>javax.sql.DataSource</res-type>
            <res-auth>Container</res-auth>
            <res-sharing-scope>Shareable</res-sharing-scope>
        </resource-ref>
    </web-app>

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

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <jsp:useBean id = "db" class="com.yyq.bean.DatabaseBean"/>
    <!DOCTYRE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
      <head>
        <title>测试数据库连接</title>
      </head>
      <body>
        <c:choose>
            <c:when test="${db.connectedOK}">连接成功!</c:when>
            <c:otherwise>连接失败!</c:otherwise>
        </c:choose>
      </body>
    </html>
    5)在Tomcat容器中配置context.xml文件
        就一个Java开发人员来说,以上的工作就算完成了,但是现在需要连接数据库,因此还需要设置JNDI相关资源,但设置的方式并非标准的一部分,而是依应用程序服务器而有所不同,假设应用程序将部署在Tomcat7上,在Tomcat7安装目录下的conf/context.xml添加资源配置。
        如路径:C:apache-tomcat-7.0.68confcontext.xml
    <?xml version='1.0' encoding='utf-8'?>
    <Context>
        <WatchedResource>WEB-INF/web.xml</WatchedResource>
    
        <Resource name="jdbc/demo" auth="Container"
            type = "javax.sql.DataSource" maxActive = "20" maxIdle="10"
            maxWait="10000" username="root" password="123456" 
            driverClassName = "com.mysql.jdbc.Driver"
            url="jdbc:mysql://localhost:3306/demo?">
        </Resource>
    
    </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
     
     
  • 相关阅读:
    GitBook基本使用
    Window 远程桌面漏洞风险,各个厂家的扫描修复方案(CVE-2019-0708)
    应急响应实战笔记(续)
    不同系统下,复制文件时新文件的日期区别
    Window应急响应(六):NesMiner挖矿病毒
    利用python输出000至999中间的数
    揭秘骗局:这是一张会变的图片
    如何查看github排行热度
    zabbix使用自动发现功能批量监控服务器端口的可用性
    使用python脚本批量设置nginx站点的rewrite规则
  • 原文地址:https://www.cnblogs.com/yangyquin/p/5395866.html
Copyright © 2011-2022 走看看