0%

Tomcat 9.0 配置数据源笔记

这是一个初级的笔记,我们利用 Tomcat 来配置数据源

前言

本篇将会简单讲解 Tomcat 数据源的配置,以及连接池配合数据源的实现连接数据库的方法。

准备前再了解些

自从有了 JNDI容器 频繁连接数据库也将不再变得麻烦,而我们可以通过 配置文件 的方式来快速连接数据库,甚至可以连接多个数据库。
那么如果开发中,数据库发生了改变,那么使用 JNBI容器 就能动态的进行变更,数据源的使用,就是JNDI 的思想。

我们可以在 tomcat 中创建 数据源,那么我们必须先安装配置好 Tomcat

(这里就不详细说了,但需要注意,将数据库的连接包jar,放到 tomcat 的 /lib/之中,就不需要每次在项目中要导入这些包了)。

本篇我所使用的是 Tomcat 9.0 ,可能我不会去配置 web.xml ,在8.0以下的可能需要配置 web.xml ,我会简单提一下。

创建/配置 Context.xml

先说说 Context ——上下文,这个“上下文”解释不太好理解,那么可以简单的认为 Context 就是读取配置文件的一个载体,将配置文件读取后以某种格式存储起来, JDNI 的配置信息,就是利用Context 来获取的,可以在这里认为 是可以用来配置 JNDI容器的存在。

一般在 Tomcat 的安装目录中 /conf/ 下会有 Context.xml 文件,此文件也是我们需要配置 的 数据源 的文件,也是 JNDI 的配置。

但Context的作用范围有三种:

  • 全局 Tomcat 范围———— /conf/Context.xml
  • locathost 范围 ———— /conf/Catalina/localhost/xxx.xml (这个我目前没弄清楚)
  • webapp 范围 ———— 在项目中 webapp/META-INF/contxt.xml

根据自己的情况,创建不同的位置,这里我使用第三种方式配置。

Context 配置

在对应的配置文件中 按如下格式写入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="1.0" encoding="UTF-8"?> 
<Context reloadable="true">

<!-- 其中name指定数据源在容器中的JNDI名
driverClassName指定连接数据库的驱动
url指定数据库服务的URL
username指定连接数据库的用户名
password指定连接数据库的密码
maxActive指定数据源最大活动连接数
maxIdle指定数据池中最大的空闲连接数
maxWait指定数据池中最大等待获取连接的客户端
-->

<Resource
name="jdbc/TestDS1"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="10"
maxWait="1000"
username="mysqluser"
password="123456"
driverClassName="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost:3306/contexttest1?serverTimezone=UTC"
/>

</Context>
  • 第一行的 <?xml version="1.0" encoding="UTF-8"?> 在第三种配置目录(webapp/META-INF/contxt.xml)下是必填的。
  • 注意由于是局部数据源,因此给 <Context> 加入 path 属性,如:<Context path="/项目名">
  • 其中 属性name 填的内容,会是将来我们创建容器是,查找此配置的依据
  • 与 数据库 连接相关的配置属性,一定要保证是正确的。
  • 大体格式是 :
    1
    2
    3
    <Context>
    <Resource ... /> <!--属性就写在 ... 中-->
    </Context>

    创建容器

    配置文件创建完后,接下来就是创建 JNDI容器,并连接数据库了。

连接的代码是 (代码可以写在 jsp 或 java类 中都行)

1
2
3
4
Context ctx = new InitialContext(); // 创建初始化 context
Context envCtx = (Context)ctx.lookup("java:comp/env"); // 创建JNDI容器
DataSource ds = (DataSource)envCtx.lookup("jdbc/TestDS1");// 获取数据源,查找已绑定的对象
Connection conn = ds.getConnection();
  • 需要导入的包有 :
    java.sql.*
    javax.sql.*
    javax.naming.*

  • 可以发现,其实前3行 就是 JNDI 的API ,而第四行是 JDBC 的连接。

  • 其中 第二行 和 第三行 可以合并 写为
    DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/TestDS1");

  • 应用可以通过这个初始化的Context经由这个目录树来定位它所需要的资源或对象。InitialContext在网页应用程序初始化时被设置,用来支持网页应用程序组件。所有的入口和资源都放在JNDI命名空间里的java:comp/env段里。
    这样,就是实现了利用 数据源 连接数据库,剩下的操作就是 我们常用的数据库的操作。

总结

由于 数据源 更加简单,更加高效,在日常我们应该更多使用数据源的方式去连接数据库。

数据库用完后,记得将连接断开conn.close()