Tomcat数据源的配置(四种方式<区别webapps目录下的Web应用和其他Web应用>)
前期工作:
1. 需要提供特定数据库的JDBC驱动,将mysql-connector-java-5.1.37-bin.jar驱动复制到Tomcat的lib路径下。
2. 创建数据库数据
create database db1;
use db1;
create table stu(
id int primary key,
naem varchar(20),
age int,
score double,
birthday date
);
INSERT INTO stu VALUES(1, "张无忌", 15, 100,"1994-12-16");
方式一:单个应用独享数据源(可以是Tomcat的任意web应用,包括webapps文件下的和其他目录下的)
在tomcat中可以在server.xml的host节点中加入Context子节点来进行项目部署,添加一个私有数据源:
<Context docBase="D:\webDemo" path="/bbb" reloadable="true">
<Resource
name="jdbc/mysql"
auth="Container"
type="javax.sql.DataSource"
driverClassName ="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/db1"
username="root"
password="root"
maxActive="100"
maxIdle="30"
maxWait="100000"
/>
</Context>
apache-tomcat-9.0.29\conf\Catalina\localhost\ddd.xml(部署web应用可以删除,为了说明不是通过自定义的web部署文件)
<Context docBase="D:\webDemo" />
D:\webDemo
D:\webDemo\test.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="javax.naming.*,java.sql.*,javax.sql.*" %>
<html>
<head>
<title>Tomcat数据源配置</title>
</head>
<body>
<%
Context ctx;
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try{
ctx=new InitialContext();
DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/mysql");
conn=ds.getConnection();
stmt=conn.createStatement();
rs=stmt.executeQuery("select * from stu where id = 1");
while(rs.next())
{
out.println(rs.getInt(1)
+ "\t" + rs.getString(2) + "\t" + rs.getInt(3)+ "\t" + rs.getDouble(4)+ "\t" + rs.getString(5) + "<br/>");
}
}catch(Exception e){
e.printStackTrace();
}finally{
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
}
%>
</body>
</html>
优点:简单
缺点:重用性差
=======================================================================
方式二:配置全局JNDI数据源,应用到所有Tomcat下部署的应用
Tomcat的conf目录下的context.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!-- The contents of this file will be loaded for each web application -->
<Context>
<!-- Default set of monitored resources. If one of these changes, the -->
<!-- web application will be reloaded. -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->
</Context>
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Resource
name="jdbc/mysql"
auth="Container"
type="javax.sql.DataSource"
driverClassName ="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/db1"
username="root"
password="root"
maxActive="100"
maxIdle="30"
maxWait="10000"
/>
</Context>
在Tomcat部署下的任意Web应用下创建test.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="javax.naming.*,java.sql.*,javax.sql.*" %>
<html>
<head>
<title>Tomcat数据源配置</title>
</head>
<body>
<%
Context ctx;
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try{
ctx=new InitialContext();
DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/mysql");
conn=ds.getConnection();
stmt=conn.createStatement();
rs=stmt.executeQuery("select * from stu where id = 1");
while(rs.next())
{
out.println(rs.getInt(1)
+ "\t" + rs.getString(2) + "\t" + rs.getInt(3)+ "\t" + rs.getDouble(4)+ "\t" + rs.getString(5) + "<br/>");
}
}catch(Exception e){
e.printStackTrace();
}finally{
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
}
%>
</body>
</html>
=======================================================================
方式三:配置全局JNDI数据源,应用到所有Tomcat下部署的应用(等效方法二)
第一步, 找到Tomcat的server.xml中GlobalNamingResources节点,在节点下加一个全局数据源
<Resource
name="jdbc/mysql"
auth="Container"
type="javax.sql.DataSource"
driverClassName ="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/db1"
username="root"
password="root"
maxActive="100"
maxIdle="30"
maxWait="100000"
/>
第二步,找到Tomcat的context.xml,在Context节点下加一个ResourceLink节点对第一步配置的数据源进行引用
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<ResourceLink global="jdbc/mysql" name="jdbc/mysql" type="javax.sql.DataSource" />
<WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
在Tomcat部署下的任意Web应用下创建test.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="javax.naming.*,java.sql.*,javax.sql.*" %>
<html>
<head>
<title>Tomcat数据源配置</title>
</head>
<body>
<%
Context ctx;
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try{
ctx=new InitialContext();
DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/mysql");
conn=ds.getConnection();
stmt=conn.createStatement();
rs=stmt.executeQuery("select * from stu where id = 1");
while(rs.next())
{
out.println(rs.getInt(1)
+ "\t" + rs.getString(2) + "\t" + rs.getInt(3)+ "\t" + rs.getDouble(4)+ "\t" + rs.getString(5) + "<br/>");
}
}catch(Exception e){
e.printStackTrace();
}finally{
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
}
%>
</body>
</html>
优点:重用性,一次性到位
缺点:没有可控性
=======================================================================
方式四:配置全局JNDI数据源,应用到单个应用(此处只能部署在Tomcat的webapps文件夹下的应用)
第一步, 找到Tomcat的server.xml中GlobalNamingResources节点,在节点下加一个全局数据源
<Resource
name="jdbc/mysql"
auth="Container"
type="javax.sql.DataSource"
driverClassName ="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/db1"
username="root"
password="root"
maxActive="100"
maxIdle="30"
maxWait="100000"
/>
第二步,找到要应用此JNDI数据源的工程Context节点,增加对全局数据源的引用ResourceLink
在aaa目录下新建META-INF文件夹,并新建context.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="aaa" path="/aaa">
<ResourceLink global="jdbc/mysql" name="jdbc/mysql" type="javax.sql.DataSource" />
</Context>
Tomcat的conf/context.xml保存最初的:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
</Context>
=======================================================================
参考资料:
https://blog.csdn.net/dyllove98/article/details/7706218
https://blog.csdn.net/zhanglf02/article/details/76726702