目录
一、理解JNDI
在我们学习连接池之前,先要了解一下什么是JNDI,因为TomCat配置连接池的数据源是要通过JNDI去配置的。
1.简介
JNDI全称为 (java Naming and Directory Interface java命名与目录接口),是一个目录服务的java API,为查找和访问各种命名和目录服务提供了通用、统一的接口。说白了,JDNI就是一个通过命名去访问资源或目录的规范,相当于map名对值。
2.作用范围
JNDI可以访问的目录和服务有很多,等等,那这跟连接池有什么关系呢?我们知道JNDI可以访问资源、服务,那这代表他也可以访问数据库,所以我们要知道通过JNDI怎么访问数据库呢?我们下面一一揭晓。
3.配置方法
JNDI是作用于Tomcat中的,所以要在conf/context.xml里配置资源。具体配置下面细讲。
二、为什么要使用连接池?
之前访问数据库大家因该都知道JDBC,通过JDBC去向数据库获取连接,但是每次都要创建连接,关闭连接,很消耗资源,比如很多用户并发访问这个页面,这样频繁的连接释放很有可能会导致数据库崩溃,效率低下,容易引发异常,那么针对这个问题,就需要连接池来解决了。
三、连接池的工作原理
在程序启动时,连接池也启动了,但是在这之前连接池会跟数据库通信拿到连接,可以设置连接池的最大连接数,最小连接数,等待时间等。这样应用程序可以直接在连接池里获取连接,最后进行一个close归还,这样没连接上的用户有空隙可以连接归还了的,最大连接数的设置正好可以解决很多用户访问页面并发的问题,实现每个用户都和连接一一对应。
配置连接池用到的参数
这些参数都是javax.sql.DataSource数据源底下的<Resource>元素,通过JDNI去设置,访问资源。
属性 | 说明 |
name | 指定资源的JNDI名字 |
auth | 指定资源的管理者,他有两个Container和Application两个可选值,Container表示容器管理Resource(资源),Application表示由web应用程序管理资源。 |
type | 指定资源所属的java类型 |
maxTotal | 从连接池分配的最大连接数,默认值为8,设置负数表示不受限制。(最多有几个连接数) |
mixIdle | 连接池中处于空闲状态的最大连接数,默认值为8,设置负数表示不受限制。(最少有几个连接数) |
max WaitMills | 当连接池没有连接时,等待获取连接的最大毫秒数,如果超出时间就会抛出异常,默认值为-1,表示可以无限等待。 |
username | 连接数据库的用户名 |
password | 连接数据库的密码 |
driverClassName | 指定数据库的驱动程序 |
url | 指定连接数据库的url |
四、Tomcat中配置连接池
1.配置context.xml文件
在Tomcat中找到conf包底下的context.xml文件,数据源需要在这个文件中配置。
//使用JNDI命名规范配置连接池的资源
<Context>
<Resource
name="jdbc/数据库名"
auth="Container"
type="javax.sqlDataSource"
maxTotal="100"
maxIdle="30"
maxWaitMills="10000"
username="root"
password="root"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/数据库名?useSSL=false&characterEncoding=utf8&serverTimezone=UTC"
/>
</Context>
注意
1.连接池的数据库我使用的是Mysql的驱动包和数据库,你们更改的时候直接在配置文件改就可以,不需要重新编译执行。
2.如果连接的数据库少的话,可以不写最大最小和等待时间的连接数,因为他们都是有默认值的。
3.在配置文件中拼接参数时,要用&来转义&。
2.配置web.xml文件
我们将连接池配置好以后,当然要在web项目中引用啦,找到你的web项目底下的WEB-INF文件夹底下的web.xml文件。它是当前web的核心配置文件。
//引用JDNI数据源
<resource-ref>
<res-ref-name>jdbc/test</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
注意
1. 数据源的引用标签是写在web-app标签中的。
2.它的引用顺序必须先是资源名称、类型、管理者。
3.添加数据库驱动文件
大数人连接数据库时都记得添加数据库的驱动,但是这里我还是要说一下,因为少数人有可能会忘记,比如我,我们知道连接数据库时驱动去与java程序打交道,所以这个东西是必须的。
最后啰嗦一句:
只要向web项目中添加jar包,都要放到lib这个文件夹中,他是专门存放包的。
4.使用lookup()方法获得数据源对象
通过上述配置,我们已经有了连接池,并且引用到了web程序中,那怎么去用它去连接池拿到连接呢?
public Connection getConnection()
{
//JDNI的Context接口获取资源
Connection connection=null;
try {
Context context=new InitialContext();
DataSource dataSource =(DataSource) context.lookup("java:comp/env/myschool");
connection= dataSource.getConnection();
} catch (NamingException e) {
throw new RuntimeException(e);
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
//归还
try {
connection.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
return connection;
}
解析
1. 获取资源连接最主要代码是在try中的三行,通过JDNI的Context接口调用loopup()去获取资源。
2.loopup方法就是寻找资源的一个方法,里面的前缀java:comp/env/ 是用来防止连接重名的,后面的myschool是数据库名。
切记切记!!!
当引入DataSource时要注意它引入的包是不是sql,否则获取不到连接,因为他的类型就是sql.DataSource,最后进行close就会自动归还连接。
五、JDBC和JNDI的区别
工作方式不一样 | JDBC:当它修改连接信息时,如用户名,程序会重新翻译并再次编译为.class文件,如果程序是java,就会将.class文件打包成jar包运行,否 是web程序时。会将.class文件打成war包运行,每次修改都要重新运行这一系列操作,因为是java代码。 JNDI : 当它去修改信息时,重启Tomcat就会将配置文件修改(因为连接池是在Tomcat中的)。 |
请求资源不一样 | JDBC:通过java来获取连接的 JNDI: Tomcat配置文件中获取连接 |
功能范围不一样 | JDBC: 只能用于获取连接数据库并执行sql语句 JNDI: 不仅可以获取连接,还可以通过名称获取文件的资源,配置资源等。 |
连接时的效率不一样 | JDBC: 连接数量增多时,会相当消耗资源,甚至崩溃。 JNDI: 可以设置最大连接数,提前备好连接,效率高。 |