zoukankan      html  css  js  c++  java
  • 单例模式读取数据库配置文件和JNDI连接数据源

    单例模式读取数据库配置文件

    单例模式是指一个类只有一个实例,只能由他本身调用,如果别人想要调用,需要此类提供一个公共的访问方法获得实例。

    1.创建.properties 文件用来存放连接数据库的信息

    diver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/kgcnews?characterEncoding=UTF-8
    user=root
    password=123456

    2.创建一个类ConfigManager用来读取配置文件+++

    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Properties;
    //懒汉模式读取配置文件
    public class ConfigManager {
        //1.创建私有化过的的ConfigManager对象
        private static ConfigManager cm ;
        //创建配置文件对象
        Properties properties;
    
        //2.私有化无参构造
        private  ConfigManager(){
    //        String file = "D:\workspace\login\src\properties\database.properties";
    //        inputStream = new FileInputStream(file);
            // "database.properties"为.properties的文件名
            String file = "database.properties";
            //把文件转换为字节流  ConfigManager.class.getClassLoader()找到本身所在的类的类加载器
            InputStream inputStream = ConfigManager.class.getClassLoader().getResourceAsStream(file);
            
            
            properties = new Properties();
            try {
                //写入properties对象
                properties.load(inputStream);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //3.提供一个全局访问点 获得该对象的实例
        public static  ConfigManager  getCm(){
            //如果没有创建对象(类的实例)
            if(cm == null){
                //同步创建对象的过程
                synchronized(ConfigManager.class){
                    cm = new ConfigManager();
                }
    
            }
            //将该类的实例返回
            return  cm;
        }
        //获得配置文件值的方法 通过getProperty(key)方法
        public String getProRes(String para){
            return  properties.getProperty(para);
        }
    
        public static void main(String[] args) {
            System.out.println(ConfigManager.getCm().getProRes("driver"));
        }
    }

     

    饿汉模式:

      1.直接创建私有实例 pirvate ConfigManager cm = new ConfigManager();

      2.私有化无参构造  private    ConfigManager (){};

          3.提供一个公共方法获得实例  privtae static ConfigManager getConf(){ return cm;}

    懒汉模式和饿汉模式的区别:第一次加载,饿汉模式效率高。多次加载懒汉模式节省内存资源。

    JNDI连接数据源

    连接池、数据源、JNDI三者间的关系及用法

    数据源:
    数据源(DataSource)用来连接数据库,创建连接(Connection)对象。
    java.sql.DataSource接口负责建立与数据库的连接
    由Tomcat提供,将连接保存在连接池中。


    连接池:
    连接池是由容器(比如Tomcat)提供的,用来管理池中的连接对象。
    连接池自动分配连接对象并对闲置的连接进行回收。
    连接池中的连接对象是由数据源(DataSource)创建的。
    连接池(Connection Pool)用来管理连接(Connection)对象。


    JNDI(Java Naming and Directory Interface,Java命名和目录接口):
    在程序中使用JNDI获取数据源。


    通过数据源创建的连接对象被统一的放入到连接池中进行管理。


    搞清楚三者的关系,然后进行下面的配置 :

    C3P0连接池在Spring的配置文件application.xml的配置:

    <!-- 配置C3P0连接池: -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${jdbc.driver}"/>
    <property name="jdbcUrl" value="${jdbc.url}"/>
    <property name="user" value="${jdbc.user}"/>
    <property name="password" value="${jdbc.password}"/>
    </bean>

    数据源的配置与使用数据源的方法:

    1、配置Tomcat的conf/context.xml

    <Resource name="jdbc/news" 
                  auth="Container"  type="javax.sql.DataSource"  maxActive="100" 
                  maxIdle="30" maxWait="10000" username="root"  password="root" 
                  driverClassName="com.mysql.jdbc.Driver" 
                  url="jdbc:mysql://127.0.0.1:3306/news"/>


    name=指定Resource的JNDI名称
    auth=指定管理Resource的Manager(Container由容器创建和管理,Application由Web应用创建和管理)
    type=指定Resource的java类
    maxActive=指定连接池中处于活动状态的数据库连接的最大数量
    maxIdle=指定连接池中处于空闲状态的数据库的最大数量
    maxWait=指定连接池中连接处于空闲的最长时间,超过这个时间会提示异常,取值为-1,表示可以无限期等待,单位为毫秒(ms)
    这里不要忘记:还需要将数据库的驱动jar包添加到,Tomcat安装目录下的lib文件夹中。

    2、使用JNDI获取连接对象
    lookup(java:comp/env/数据源名称");
    //java:comp/env/这是Java的语法要求,必须写上。
    //这里的数据源名称就是上面的jdbc/news,这个news是项目名。

    3.编写代码获取数据源

      public Connection getConnection2() {
       try {
        //初始化上下文
        Context cxt=new InitialContext();
        //获取与逻辑名相关联的数据源对象
        DataSource ds=(DataSource)cxt.lookup("java:comp/env/jdbc/news");
        conn=ds.getConnection();
       } catch (NamingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
       } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
       }
       return conn;
      }

    还有一点要注意:测试连接是否成功,需要在jsp页面输出connection,而不是在java类中Run As,应为数据源配置在Tomcat中需要把Web项目放入Tomcat容器中运行。jsp页面代码如下:

    示例: 

    <%
    BaseDao baseDao=new BaseDao();
    Connection connection=baseDao.getConnection2();

    %>

    <%=connection %>

    在Tomcat中的配置

    配置在:context.xml文件内

    F:apache-tomcat-7.0.68-windows-x64apache-tomcat-7.0.68confcontext.xml

    ---------mySQL
    <Resource name="jdbc/news"
    auth="Container" type="javax.sql.DataSource"
    maxActive="100"
    maxIdle="30" maxWait="10000" username="root"
    password="Admin001"
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://127.0.0.1:3306/news"/>
    ----------Oracle
    <Resource name="jdbc/orcl"
    auth="Container" type="javax.sql.DataSource"
    maxActive="100"
    maxIdle="30" maxWait="10000" username="wuyong"
    password="Admin001"
    driverClassName="oracle.jdbc.OracleDriver"
    url="jdbc:oracle:thin:@localhost:1521:orcl"/>

    使用JNDI获取连接对象
    java:comp/env/jdbc/news

    这段为固定写法
    java:comp/env/

    JNDI和JDBC的区别:

    Java Database Connectivity (JDBC)是一个标准的Java API,它由一组类和接口组成,Java应用程序开发人员使用它来访问数据库和执行SQL语句 JNDI(Java Name Directory Interface),可不仅仅是进行数据库定位的, 它是给当前应用服务器所管理的所有资源一个唯一的标识,包括数据库,网页,文件, 连接池等等。

    在weblogic配置JDBC数据源的时候碰到JNDI这个完全陌生的词,就查了一下,简单的理解下。
    JDBC:jdbc是数据库中间代理商为了是java连接数据库而定的一个协议或者说是方法,是数据库的接口,通过jdbc-odbc的方法进行数据库连接,Java应用程序开发人员使用它来访问数据库和执行SQL语句
    JNDI:程序员熟悉java语言、了解JDBC技术和MySQL,就可以很快开发出相应的应用程序。但是会遇到

    1、数据库服务器名称MyDBServer 、用户名和口令都可能需要改变,由此引发JDBC URL需要修改;

    2、数据库可能改用别的产品,如改用DB2或者oracle,引发JDBC驱动程序包和类名需要修改;

    3、随着实际使用终端的增加,原配 置的连接池参数可能需要调整;等问题。

    解决办法:

    程序员应该不需要关心“具体的数据库后台是什么?JDBC驱动程序是什么?JDBC URL格式是什么?访问数据库的用户名和口令是什么?”等等这些问题,程序员编写的程序应该没有对 JDBC 驱动程序的引用,没有服务器名称,没有用户名称或口令 —— 甚至没有数据库池或连接管理。而是把这些问题交给J2EE容器来配置和管理,程序员只需要对这些配置和管理进行引用即可。
    由此,就有了JNDI.用了JNDI之后的做法:首先,在在J2EE容器中配置JNDI参数,定义一个数据源,也就是JDBC引用参数,给这个数据源设置一个名称;然后,在程序中,通过数据源名称引用数据源从而访问后台数据库。

  • 相关阅读:
    Hadoop杂记
    hadoop主节点(NameNode)备份策略以及恢复方法
    (转)第12章 Shell脚本编程
    Hadoop添加删除节点
    secondarynamenode异常
    (转)Memcached笔记——(一)安装&常规错误&监控
    浅(kou)谈(hu)杜教筛
    Pollard_Rho 算法
    Miller_Rabin 素数判定算法
    zoj分类(包括poj已做的)
  • 原文地址:https://www.cnblogs.com/jiayiblog/p/11056685.html
Copyright © 2011-2022 走看看