JNDI
- Java Naming and Directory Interface,Java命名和目录接口,通过名称将资源与服务进行关联
- JNDI是一个应用程序设计的API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口,类似JDBC都是构建在抽象层上。
- JNDI优点:
- 包含了大量的命名和目录服务,使用通用接口来访问不同种类的服务;
- 可以同时连接到多个命名或目录服务上;
- 建立起逻辑关联,允许把名称同Java对象或资源关联起来,而不必指导对象或资源的物理ID。
JNDI的简单应用
应用步骤
发布信息:修改Tomcat\conf\context.xml文件
注:第一次运行时可能会删除,需再次配置
。
<Context>
<Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="root" password="*****"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@//localhost:1521:orcl"
/>
</Context>
配置:在项目web.xml文件中添加配置
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/test</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
获取资源:使用lookup()进行查找
//javax.naming.Context提供了查找JNDI 的接口
DataSource ds = null;
try {
Context initContext = new InitialContext();//初始化Context对象
//java:comp/env/为前缀
DataSource ds = (DataSource)initContext.lookup("java:comp/env/jdbc/test");//调用lookup()方法
out.print(ds);
} catch (Exception e) {
e.printStackTrace();
}
connect = ds.getConnection();
....
JNDI和JDBC的区别及使用
- JDBC(Java Database Connectivity)是由数据库中间服务商提供的,用于连接数据库的Java API。一组类和接口(对接数据库)。
- JNDI(Java Name Directory Interface)是为应用服务器(Tomcat)管理资源所设置的目录样式的唯一标识。(数据库、网页、文档等)
- JNDI通过在Tomcat服务器的配置文件和项目的web.xml上配置参数,可以灵活、快速地获取数据库配置信息并连接。对比JDBC,当数据库参数、路径等改变时也不需要改变代码,比较灵活简单。
连接池
- 数据库连接池的基本原理就是为数据库建立一个缓冲池。
- 数据库连接池的主要作用就是负责分配、管理和释放数据库连接,它允许程序重复使用同一个现有的数据库连接,大大缩短了运行时间,提高了执行效率。
- 至少会保持最小连接数
传统的连接机制与数据库连接池的运行机制区别
- 传统统链接: 一般来说,Java应用程序访问数据库的过程是:
①装载数据库驱动程序;
②通过JDBC建立数据库连接;
③访问数据库,执行SQL语句;
④断开数据库连接。 - 使用了数据库连接池的机制:
(1) 程序初始化时创建连接池
(2) 使用时向连接池申请可用连接
(3) 使用完毕,将连接返还给连接池
(4) 程序退出时,断开所有连接,并释放资源
数据源
- javax.sql.DataSource负责建立与数据库的连接
- 从Tomcat的数据源获得连接
- 把连接保存在连接池中
使用连接池的明显优势
- 资源的高效利用
- 更快的系统反应速度
- 减少了资源独占的风险
- 统一的连接管理,避免数据库连接泄露
使用连接池实现数据库连接
-
配置:Tomcat的conf/context.xml中的配置
<Context> <Resource name="jdbc/news" auth="Container"type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="sa" password=“sa" driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://localhost:5545;DatabaseName=NewsManager"/> </Context>
-
配置web.xml文件
-
添加数据库驱动文件(加入到Tomcat的lib中)
-
进行代码编写,实现查找数据源
import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; public class BaseDao { public Connection getConnection () { Context ctx; try { ctx = new InitialContext(); //获取与逻辑名相关联的数据源对象 DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/news"); //分为两部分java:comp/env为JavaEE默认路径,jdbc/news为DataSource名 conn=ds.getConnection(); } catch (SQLException exception) { exception.printStackTrace(); }catch (NamingException namingException) namingException.printStackTrace(); } rutern conn } }
c3p0
- C3P0是一个开源的JDBC连接池,它实现了数据源与JNDI绑定,支持JDBC3规范和实现了JDBC2的标准扩展说明的Connection和Statement池的DataSources对象。
- 即将用于连接数据库的连接整合在一起形成一个随取随用的数据库连接池(Connection pool)。
- 当我们在进行基于数据库的web程序开发时,我们可以先在主程序(如Servlet、Bean)中通过JDBC中的DriverManager建立数据库连接,然后将要对数据库进行操作的sql语句封装到Statement中,最后在返回结果集后断开数据库连接。以上是较为传统的开发模式,然而用这种模式开发会埋下严重的安全隐患
1.导入jar包
主要是c3p0和mysql,其他根据需求添加
配置文件必须命名为c3p0-config.xml,并且放在src目录下,配置文件如下
<?xml version="1.0" encoding="UTF-8" ?>
<c3p0-config>
<default-config>
<property name="jdbcUrl">
<![CDATA[
jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF8&useServerPrepStmts=true&prepStmtCacheSqlLimit=256&cachePrepStmts=true&prepStmtCacheSize=256&rewriteBatchedStatements=true
]]>
</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">root</property>
<property name="password">123</property>
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
<property name="acquireIncrement">3</property>
<!-- 初始化数据库连接池时连接的数量 -->
<property name="initialPoolSize">10</property>
<!-- 数据库连接池中的最小的数据库连接数 -->
<property name="minPoolSize">2</property>
<!-- 数据库连接池中的最大的数据库连接数 -->
<property name="maxPoolSize">10</property>
</default-config>
</c3p0-config>
java代码部分:
package com.wang.utils;
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class JDBCutils {
private static Connection conn;
private static ComboPooledDataSource ds = new ComboPooledDataSource();
public static Connection getConnection() {
try {
conn = ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
} catch (PropertyVetoException e) {
e.printStackTrace();
}
return conn;
}