<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener"/>
<Listener SSLEngine="on" className="org.apache.catalina.core.AprLifecycleListener"/>
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>
<GlobalNamingResources>
<Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/>
</GlobalNamingResources>
<Service name="Catalina">
<!-- 连接器 编码utf-8 port端口 -->
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>
<Engine defaultHost="localhost" name="Catalina">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
</Realm>
<!-- 引擎,默认项目部署在webapps文件夹里,autoDeploy表示自动设置,只要放入到 appBase中,tomcat自动部署。unpackWARs -- WAR文件,tomcat自动解压并部署-->
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
<!-- 日志阀 -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t "%r" %s %b" prefix="localhost_access_log" suffix=".txt"/>
<!-- 地址控制阀,不允许10.7.155.4访问, 10.7.155.* 不允许10.7.155内多有的ip访问
<Valve className="org.apache.catalina.valves.RemoteAddrValue" allow="" deny="10.7.155.4" -->
<!-- reloadable="true",eclipse每次自动会重启服务器,项目上线时部署时,应该设置为false
把docBase的东西部署到服务器,通过path路径惊醒访问
<Context docBase="D:\tomcat9.0\wtpwebapps\house" path="/house" reloadable="true" source="org.eclipse.jst.jee.server:house"/> -->
</Host>
</Engine>
</Service>
</Server>
在部署项目的时候,启用数据库连接池,xml中不能直接使用&符号,所有用转义符&代替
<Resource name="jdbc/hr"
auth="Container" -- 认证,让tomcat帮助认证用户名和密码,如果不认证,需要手动在代码中指定用户名和密码,tomcat帮助认证有更高的效率。
type="javax.sql.DataSource" -- 连接类型
maxIdle="10" -- 初始化时连接数
maxActive="100" -- 最大连接数
maxWait="5000" -- 超时时间
username="root" -- 连接用户名
password="123456" -- 连接密码
driverClassName="com.mysql.jdbc.Driver" -- 驱动名
url="jdbc:mysql://localhost:3306/hr?useUnicode=true&characterEncoding=utf8"--连接url,指定使用字符集和字符编码
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"--通过factory可以看见创建连接时的问题,当连接不上会显示错误原因
/>
在项目上线的时候连接池一般是使用部署服务器的数据库连接池,上面再Tomcat的配置中配置了连接池,然后下面在Java代码中使用Tomcat的连接池的数据库连接。
package com.czy.utils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
/**
* 操作数据库工具类
* @author czy
*
*/
public class DbConfig {
/* private static final String JDBC_DRV="com.mysql.jdbc.Driver";
private static final String JDBC_URL="jdbc:mysql://localhost:3306/hr?useUnicode=true&characterEncoding=utf8&useSSL=false";
private static final String JDBC_UID="root";
private static final String JDBC_PWD="123456";*/
/**
* 加载数据库的静态代码块
*/
/* static{
try {
Class.forName(JDBC_DRV);
} catch (ClassNotFoundException e) {
throw new DbException("加载数据库驱动失败!", e);
}
}*/
private static DataSource dataSource = null;
static{
try {
Context ctx = new InitialContext();
//拿到连接池
dataSource = (DataSource) ctx.lookup("java:comp/env/jdbc/hr");
} catch (NamingException e) {
e.printStackTrace();
throw new DbException("创建数据库池时出错", e);
}
}
/**
* 构造器,不允许创建对象
*/
private DbConfig() {
throw new AssertionError();
}
/**
* 建立数据库连接
* @return 数据库连接对象
*/
public static Connection getConnection(){
try {
//return DriverManager.getConnection(JDBC_URL, JDBC_UID, JDBC_PWD);
return dataSource.getConnection();
} catch (Exception e) {
throw new DbException("创建数据库连接失败!", e);
}
}
/**
* 关闭连接语句
* @param stmt 需要关闭的连接语句
*/
public static void closeStatment(Statement stmt) {
try {
if(stmt != null && !stmt.isClosed()) {
stmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
throw new DbException("关闭语句失败", e);
}
}
/**
* 关闭结果集
* @param rs 需要关闭的结果集
*/
public static void closeResultSet(ResultSet rs) {
try {
if(rs != null && !rs.isClosed()) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
throw new DbException("关闭结果集失败", e);
}
}
/**
* 关闭数据库连接
* @param con 需要关闭的数据库连接
*/
public static void closeConnection(Connection con){
try {
if(con != null && !con.isClosed()) {
//多态
//使用数据库连接池的con并不是mysql提供的con
//此处的close()并不是断开连接,而是释放连接池的连接,把连接归还到连接池
con.close();
}
} catch (SQLException e) {
throw new DbException("关闭数据库连接失败!", e);
}
}
}