Tomcat数据源

本文详细介绍了在Tomcat中使用数据库连接池(如数据源)以提高JDBC操作性能的方法,包括配置数据库连接池、通过JNDI查找连接、以及在Web项目中配置数据源的步骤。此外,还提供了简化数据库连接操作的代码示例,以减少资源浪费并提升性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传统JDBC的使用步骤存在以下四个步骤:

1加载数据库驱动程序:

2 通过DriverManager类取得数据库的连接对象。

3.通过Connection实例化PreparedStatement对象,编写SQL命令操作数据库。

4.数据库属于资源操作,操作完成后要关闭数据库以释放资源。

对于不同的用户只有操作不同,但是对于1,2,4三个步骤很明显是一个重复的操作。

如果开发中直接使用JDBC操作的话,那么就会产生这种性能问题,那么怎么做才是最合适的呢?如果假设数据库不关闭,以后如果有新的用户使用的时候直接取一个已经有的连接的话。

 在Tomcat中使用数据库连接池:

在web容器中,数据库的连接池都是通过数据源(javax.sql.DataSorce)访问的,即可以通过javax.sql.DataSorce类取得一个Connection对象,但是要想得到一个DataSorce对象需要使用JNDI进行查找。

 原理图:

对Tomcat中的Servlet.xml文件进行配置:配置mysql的数据库连接池:

JNDI属于命名及目录查找接口,主要功能是用于进行查找的,查找对象。但是,现在的数据库连接池是需要在tomcat上完成配置的:

要修改servlet.xml文件才可以起作用:

配置mysql连接池:

 <Contextpath="/text"docBase = "**" reloadable ="true">

   <Resource name ="jdbc/text"  auth= "Container"  type = "javax.sql.DataSorce"   maxActive ="100"   maxIdle = "30"   maxWait = "10000"   username = "root"   password = "****"   driverClassName = "org.git.mm.Driver"   url = "jdbc:mysql://localhost:3306/text"/>

 

配置Oracle连接池:

<Contextpath="/text"docBase = "**" reloadable = "true">  

<Resourcename ="jdbc/text"     auth= "Container"     type = "javax.sql.DataSorce"     maxActive ="100"     maxIdle = "30"     maxWait = "10000"     username = "root"     password = "****"    driverClassName = "Oracle.jdbc.driver.OracleDriver"   url = "jdbc:Oracle:thin:@localhost:1521:text"/>

 

配置完server.xml之后需要在一个web项目中配置web.xml:指明数据源的名称:

 

 

<resource-ref>

 

  <description>DBConnection</description>

 

  <res-ref-name>jdbc/text</res-ref-name>

   <res-type>javax.sql.DataSorce<res-type>

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

</resouce-ref>


查找数据源:

数据源的操作使用的是JNDL方式进行查找的,所以使用数据源取数据库的连接

必须按照如下步骤进行:

(1) 初始化名称查找上下文:Context ctx = newInitialContext();

(2) 通过名称查找DataSource对象:Datasource ds = (DataSource)ctx.lookup(JNDL名称); 

(3) 通过DataSource取得一个数据库的连接:Connectionconn = ds.getConnection();

JNDI服务(java Naming and Directory Interface,java命名及目录接口)是javaEE提供的一个服务,其服务的主要功能是通过一个名称的“key”查找到一个对象的value。

通过数据源取得数据库连接的代码:注意:在使用tomcat进行数据源查找时,java:comp/env(环境命名上下文Enviromnet

NamingContext (ENC))属性必须设置,对于一些高级的服务器可以不用设置(例如weblogic)。即下面的代码改为:String DSNAME

="java:comp/env/jdbc/mldn";//名称

如果取得连接,则会输出一个对象的信息:

 在以后的开发中就可以直接将数据源应用到项目中了,只要数据源的名称不变,则数据库可以任意更换,提升了操作的性能。充分的体现了java的设计思想——可移植性。

 数据源连接代码:

总结:

 

(1)通过数据库连接池可以提高数据库的操作性能,避免掉一些无用的操作。

  (2)数据源使用时要使用JNDI进行查找,而且查找时需要指定“java:comp/env”的环境属性。

 附:

使JDBC连接数据库:

package com.jd.jdbc1;

import java.sql.Connection;

impor tjava.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

public class SelectDB

//驱动名(各个数据库不同)

static final String DRIVER = "com.mysql.jdbc.Driver";

 

//连接数据库的地址(各个版本的数据库不同)

 

static final String URL = "jdbc:mysql://localhost:3306/test";

//用户名

static final String USER = "root";

//密码

static final String PWD = "fendou";

/**

* 查询数据库

*/

public static void getAll()

{

  Connection conn = null;

  Statement stmt = null;

   ResultSet rs = null;

 //1、加载驱动

  try

   {

     Class.forName(DRIVER);

//2、使用DrvierManager得到数据库的连接

 

     conn = DriverManager.getConnection(URL, USER,PWD);

//3、创建发送SQL语句的对象

     stmt = conn.createStatement();

//4、执行SQL语句

    String sql = "select id,name,age fromstudent";

//5、用ResultSet接收查询后的结果集

     rs = stmt.executeQuery(sql);

//6、循环一条一条的取出结果集的记录

    while(rs.next())//判断结果集是否有数据

    {

//7、一列一列的取出数据(注意对应数据类型)

 

/*intid = rs.getInt(1);

 

String name = rs.getString(2);

int age = rs.getInt(3);*/

//一般情况都是写列名来获得该列的内容

     int id = rs.getInt("id");

    String name = rs.getString("name");

     int age = rs.getInt("age");

    System.out.println(id+","+name+","+age);

    }

  }

  catch (ClassNotFoundException e)

  {

    e.printStackTrace();

  }

   catch (SQLException e)

  {

    e.printStackTrace();

  }

  finally

  {

  try

 

  {

    if(rs != null)

  {

//5、关闭rs

    rs.close();

  }

    if(stmt != null)

  {

//5、关闭stmt

    stmt.close();

  }

    if(conn != null)

  {

//6、关闭连接

    conn.close();

  }

  } 

    catch (SQLException e)

  {

//TODO Auto-generated catch block

    e.printStackTrace();

  }

 }

}

  public static void main(String[] args)

  {

    getAll();

  } 

}


 

 

 

package com.jd.jdbc1;

 

import java.sql.Connection;

 

import java.sql.DriverManager;

 

import java.sql.SQLException;

 

public class TestConn

 

{

 

//驱动名(各个数据库不同)

 

static final String DRIVER = "com.mysql.jdbc.Driver";

 

//连接数据库的地址(各个版本的数据库不同)

 

static final String URL = "jdbc:mysql://localhost:3306/test";

 

//用户名

 

static final String USER = "root";

 

//密码

 

static final String PWD = "fendou";

 

//得到连接数据库的方法

 

public static void getConn()

 

{

 

Connection conn = null;

 

//1、加载驱动

 

try

 

{

 

Class.forName(DRIVER);

 

//2、使用DrvierManager得到数据库的连接

 

conn =DriverManager.getConnection(URL, USER, PWD);

 

//3、打印conn看其是否为null

 

System.out.println(conn);

 

}

 

catch(ClassNotFoundException e)

 

{

 

//TODO Auto-generated catch block

 

e.printStackTrace();

 

}

 

catch(SQLException e)

 

{

 

//TODO Auto-generated catch block

 

e.printStackTrace();

 

}

 

finally

 

{

 

try

 

{

 

if(conn!= null)

 

{

 

//4、关闭连接

 

conn.close();

 

}

 

} 

 

catch(SQLException e)

 

{

 

//TODO Auto-generated catch block

 

e.printStackTrace();

 

}

 

}

 

}

 

publicstatic void main(String[] args)

 

{

 

getConn();

 

}

 

}


 

 

 

 

 

 

 

 

package com.jd.jdbc1;

 

 

 

import java.sql.Connection;

 

impor tjava.sql.DriverManager;

 

import java.sql.SQLException;

 

 

 

 

 

 

 
public class TestConn

 

{

 

//驱动名(各个数据库不同)

 

static final String DRIVER = "com.mysql.jdbc.Driver";

 

//连接数据库的地址(各个版本的数据库不同)

 

static final String URL = "jdbc:mysql://localhost:3306/test";

 

//用户名

 

static final String USER = "root";

 

//密码

 

static final String PWD = "fendou";

 

//得到连接数据库的方法

 

public static void getConn()

 

{

 

Connection conn = null;

 

//1、加载驱动

 

try

 

{

 

Class.forName(DRIVER);

 

//2、使用DrvierManager得到数据库的连接

 

conn =DriverManager.getConnection(URL, USER, PWD);

 

//3、打印conn看其是否为null

 

System.out.println(conn);

 

 

 

}

 

catch(ClassNotFoundException e)

 

{

 

//TODO Auto-generated catch block

 

e.printStackTrace();

 

}

 

catch(SQLException e)

 

{

 

//TODO Auto-generated catch block

 

e.printStackTrace();

 

}

 

finally

 

{

 

try

 

{

 

if(conn!= null)

 

{

 

//4、关闭连接

 

conn.close();

 

}

 

 

 

} 

 

catch(SQLException e)

 

{

 

//TODO Auto-generated catch block

 

e.printStackTrace();

 

}

 

}

 

}

 

 

 

 

 

public static void main(String[] args)

 

{

 

getConn();

 

 

 

}

 

}

 

 



 


 

 

 

package com.jd.jdbc1;

 

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.sql.Statement;

 

/**

* 

*@author Administrator

*对数据库进行添加、删除、修改

*/

public class UpdateDB

{

//驱动名(各个数据库不同)

static final String DRIVER = "com.mysql.jdbc.Driver";

//连接数据库的地址(各个版本的数据库不同)

static final String URL = "jdbc:mysql://localhost:3306/test";

//用户名

static final String USER = "root";

//密码

static final String PWD = "fendou";

//添加记录

public static void add()

{

Connection conn = null;

Statement stmt = null;

//1、加载驱动

try

{

Class.forName(DRIVER);

 

//2、使用DrvierManager得到数据库的连接

conn =DriverManager.getConnection(URL, USER, PWD);

//3、创建发送SQL语句的对象

stmt =conn.createStatement();

//4、执行SQL语句

introws = stmt.executeUpdate("insert into student values(null,'lisi',23)");

if(rows> 0)

{

System.out.println("操作成功");

}

else

{

System.out.println("操作失败");

}

 

}

catch(ClassNotFoundException e)

{

//TODO Auto-generated catch block

e.printStackTrace();

}

catch(SQLException e)

{

//TODO Auto-generated catch block

e.printStackTrace();

}

finally

{

try

{

if(stmt!= null)

{

//5、关闭stmt

stmt.close();

}

if(conn!= null)

{

//6、关闭连接

conn.close();

}

 

} 

catch(SQLException e)

{

//TODO Auto-generated catch block

e.printStackTrace();

}

}

}

 

//添加记录

public static void delete()

{

Connection conn = null;

Statement stmt = null;

//1、加载驱动

try

{

Class.forName(DRIVER);

//2、使用DrvierManager得到数据库的连接

conn =DriverManager.getConnection(URL, USER, PWD);

//3、创建发送SQL语句的对象

stmt =conn.createStatement();

//4、执行SQL语句

String sql = "delete from student where id=1";

int rows = stmt.executeUpdate(sql);

if(rows> 0)

{

System.out.println("操作成功");

}

else

{

System.out.println("操作失败");

}

 

}

catch(ClassNotFoundException e)

{

//TODO Auto-generated catch block

e.printStackTrace();

}

catch(SQLException e)

{

//TODO Auto-generated catch block

e.printStackTrace();

}

finally

{

try

{

if(stmt!= null)

{

//5、关闭stmt

stmt.close();

}

if(conn!= null)

{

//6、关闭连接

conn.close();

}

 

} 

catch(SQLException e)

{

//TODO Auto-generated catch block

e.printStackTrace();

}

}

}

 

//添加记录

publicstatic void update()

{

Connectionconn = null;

Statementstmt = null;

//1、加载驱动

try

{

Class.forName(DRIVER);

//2、使用DrvierManager得到数据库的连接

conn =DriverManager.getConnection(URL, USER, PWD);

//3、创建发送SQL语句的对象

stmt =conn.createStatement();

//4、执行SQL语句

String sql = "update student set age=44 where id=3";

int rows = stmt.executeUpdate(sql);

if(rows> 0)

{

System.out.println("操作成功");

}

else

{

System.out.println("操作失败");

}

 

}

catch(ClassNotFoundException e)

{

//TODO Auto-generated catch block

e.printStackTrace();

}

catch(SQLException e)

{

//TODO Auto-generated catch block

e.printStackTrace();

}

finally

{

try

{

if(stmt!= null)

{

//5、关闭stmt

stmt.close();

}

if(conn!= null)

{

//6、关闭连接

conn.close();

}

 

} 

catch(SQLException e)

{

//TODO Auto-generated catch block

e.printStackTrace();

}

}

}

public static void main(String[] args)

{

   add();

   //delete();

   //update();

}

}


 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值