数据库文件配置和数据库连接池的使用

来源:互联网 发布:三国杀 知乎 编辑:程序博客网 时间:2024/06/05 18:59

    一般我们在使用程序连接、操作数据库时,通常会写一个Dao类,做门用作操作数据库,以方便之用,但是对数据库的连接、登录信息一般都是写死的代码,如果更换操作其他的数据库,就必须更改代码,数据库文件配置就是解决这样的问题---把要连接的数据库驱动信息,登录帐号密码等信息写在配置文件中,而在代码中,用固定的几行先读取文件中的配置信息,再连接操作数据库,即使更换其他的数据库,也不需要更该代码,只需修改下配置文件几个参数即可。数据库连接池则是解决-----多用户并发访问数据库,数据库连接性能优化方面的问题。

数据库文件配置

数据库信息为硬解码形式。在该实例中,我们将数据库信息放置在配置文件中,代码通过读取配置文件,获得信息并对数据库进行访问连接。也就是说,我们把要连接的数据库驱动信息,登录帐号密码等信息写在配置文件中,而在代码中,用固定的几行先读取文件中的配置信息,再连接操作数据库,即使更换其他的数据库,也不需要更该代码,只需修改下配置文件几个参数即可。

一、介绍
在前面的例子中,数据库的一些信息,如:数据库名/地址/用户名密码,都是写死在代码中的。如果在实际上线中,数据库信息与开发时的数据库信息不同,我们需要修改代码,重新编译项目。

解决的办法是将这些可能发生变化的数据库信息写在文件中,代码在运行时读取这些信息,再根据这些信息访问数据。一旦数据库的信息发送变化,修改配置文件便可,无需修改代码

properties类型文件在java开发中作为配置文件类型使用的比较多。此例中,我们的配置文件就是properties类型。

 

本例采用JSP登录注册页面,在需要连接数据库验证信息时,对数据库的登录信息写到配置文件。
二、步骤
1、建立properties文件,并将该文件properties 文件放在classpath指定的路径中,便于Java对象对此文件进行访问。

如建立文件jdbc.properties(后缀名就是properties),将该文件放置在操作数据库的Java类相同的文件中,该类在运行时,在当前文件夹下找这个文件。

l  对应内容如下:

jdbc.driverClassName=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/wgw

jdbc.username=root

jdbc.password=root

这4行分别存储了要连接的数据库驱动信息,url,连接登录数据库的用户名和密码。

2、使用java代码加载properties文件。并读取properties文件中的内容。

  1. public class UserDao
  2. {
  3.    /***
  4.    *判断用户名和密码是否匹配
  5.    ***/
  6.    public boolean isUserPasswordCorrect(UserBean user){
  1. boolean result = false;
            /*设置所需变量*/
  2.    Connection con=null;
  3.    PreparedStatement pmt=null;
  4.    ResultSet rs=null;
  5. /*访问jdbc.properties文件*/
  6.    Properties prop=new Properties();
  7.    try{
  8.             InputStream in=this.getClass().getResourceAsStream("jdbc.properties");
  9.             prop.load(in);
  10.             if(in!=null)     in.close(); 
  11.         }catch(java.io.IOException e){
  12.             System.out.println("[OpenCn] 配置文件打开错误! ");
  13.             return false;
  14.         }
  15. /*读取各种参数*/
  16. String driver   = prop.getProperty("jdbc.driverClassName");  
  17.     String url = prop.getProperty("jdbc.url");  
  18.     String username = prop.getProperty("jdbc.username");  
  19.     String password = prop.getProperty("jdbc.password");  
  20.    try {
  21.    /*建立连接*/
  22.    Class.forName(driver).newInstance();
  23.    con=DriverManager.getConnection(url,username,password);     
  24. /*完成查询*/
  25.    pmt=con.prepareStatement("select * from tb_user where user_name = ? and user_password = ?");
  26.    pmt.setString(1,user.getUserName());
  27.    pmt.setString(2,user.getUserPassword());
  28.    rs = pmt.executeQuery();
  29.    /*根据数据库信息判断是否登录*/
  30.    if(rs.next()){
  31.             result = true;
  32.    }else{
  33.             result = false;
  34.    }
  35. } catch (ClassNotFoundException e) {
  36.                      e.printStackTrace();
  37.             } catch (SQLException e) {
  38.                      e.printStackTrace();
  39.             } catch(Exception e){
  40.                      e.printStackTrace();
  41.             }finally{
  42.                        try{
  43.                      /*关闭各种资源*/
  44.                      if(rs!=null)
  45.                                rs.close();
  46.                      if(pmt!=null)
  47.                                pmt.close();
  48.                      if(con!=null)
  49.                                con.close();
  50.                      }catch(Exception e){}
  51.                     }
  52.             return result;
  53.    }
  54. }

 

注意:jdbc.properties放置位置:

l  1、classpath路径中,如放置在UserDao.class文件同目录下。

l  InputStream in=this.getClass().getResourceAsStream("jdbc.properties");

l  2、web应用中放置在classes文件夹下。

l  InputStream in=this.getClass().getResourceAsStream("/jdbc.properties");

 

数据库池的使用

l  传统数据库访问模式存在下面的一些缺陷:

l  每次数据库请求都需要建立一次数据库连接,而每建立一次数据库连接就需要花费0.05s~1s的时间,这个时间相对于数据库本身的操作时间和软件本身的执行时间来说,是非常漫长的。

l  由于没有对连接数据库的连接数量进行控制,因此可能出现超出数据库处理能力的连接数量和处理请求,导致系统的崩溃。

l  单独管理每一个连接,并进行使用后的资源回收。在这种方式下,如果某些连接出现了异常,导致无法正常关闭连接,那么将会导致资源的严重浪费甚至数据库服务器的内存泄漏。

l  由于以上的缺点,开发人员设计出一种叫做“连接池”的技术,来处理传统连接方式带来的问题。

基本原理

l  数据库连接池的基本思想就是为数据库连接建立一个“存储池”。

l  数据库建立初期,预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“连接池”中申请一个,使用完毕之后再将该连接作为公共资源保存在“连接池”中,以供其他连接申请使用。

l  在这种情况下,当需要连接时,就不用再需要重新建立连接,这样就在很大程度上提高了数据库连接处理的速度;同时,还可以通过设定连接池最大连接数来防止系统无控制的与数据库连接;更为重要的是可以通过连接池管理机制监视数据库的连接的数量以及各连接的使用情况,为系统开发﹑测试及性能调整提供依据。

Tomcat中配置连接池

l  Tomcat使用的是dbcp数据源(apache上的一个java连接池项目,tomcat标准的连接池组件)。相应的jar包已经放入位置。因此只需配置。

l  配置的方法有很多种。我们选取下面这个方法的原则依然是便于项目移植。

l  配置项目私有的连接池。

l  需要添加的文件:/项目名/META-INF/context.xml

l  需要修改的文件:/项目名/WEB-INF/web.xml

第一步:

添加/项目名/META-INF/context.xml,文件如下所示:

l  <?xml version="1.0" encoding="UTF-8"?>

l  <Context reloadable="true">

l     <Resourcename="jdbc/wgw"

l              auth="Container"

l              type="javax.sql.DataSource"

l              maxActive="100"

l              maxIdle="30"

l              maxWait="10000"

l              username="root"

l              password="root"

l              driverClassName="com.mysql.jdbc.Driver"

l              url="jdbc:mysql://localhost:3306/wgw"/>

l  </Context>

其中的每个字段都有自己的含义:

l  name:定义数据库连接的名称。通常取”jdbc/XXX”的格式。

l  auth="Container"(不能改动)

l  type   "javax.sql.DataSource" (不能改动)

l  maxIdle:表示数据库连接池中处于空闲状态的最大数据库连接数。设为0表示无限制。

l  minIdle:表示数据库连接池中处于空闲状态的最小数据库连接数。设为0表示无限制。

l  maxActive:表示连接池中处于活动状态的最大数据库连接数。设为0表示无限制。

l  maxWait:表示数据库连接池中数据库连接处于空闲的最大等待时间(以毫秒为单位)。如果超过此时间将接到异常。设为-1表示无限制。

l  driverClassName:指定JDBC驱动器的类。

l  username:表示登陆数据库时使用的用户名。

l  password:为登陆数据库的密码。

l  url:表示的是需要连接的数据库的地址和名称。

l  这四个属性的定义与前面数据库操作的四个定义相同

第二步:

/项目名/WEB-INF/web.xml<web-app>标签中添加对数据源的引用。

l     <resource-ref>

l               <description>mysqlConnection</description>

l               <res-ref-name>jdbc/wgw</res-ref-name>

l               <res-type>javax.sql.DataSource</res-type>  

l               <res-auth>Container</res-auth>          

l     </resource-ref>

l  子节点说明:

l  description,描述信息;
res-ref-name,参考数据源名字,同上一步的属性name;
res-type,资源类型,”javax.sql.DataSource”;
res-auth,”Container”;

l  两步即可。

l  注意:在tomcat较低的版本(4版)中,书写的形式有所不同,参见google。

使用连接池访问数据库

不再使用

  1. Class.forName("com.mysql.jdbc.Driver");
  2. con=DriverManager.getConnection(url,user,password);

而是使用引入javax.naming.* 包。

  1. Context initCtx = new InitialContext();
  2. Context ctx = (Context) initCtx.lookup("java:comp/env");
  3. //获取连接池对象
  4. Object obj = (Object) ctx.lookup("jdbc/wgw");
  5. //类型转换
  6. javax.sql.DataSource ds = (javax.sql.DataSource)obj;
  7. con=ds.getConnection();

其中,1、2、6、7行写死。变化的只有4行,需要与Resource 中name 保持一致。

0 0