<?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>
在部署項目的時候,啟用數(shù)據(jù)庫連接池,xml中不能直接使用&符號,所有用轉義符&代替
<Resource name="jdbc/hr"
auth="Container" -- 認證,讓tomcat幫助認證用戶名和密碼,如果不認證,需要手動在代碼中指定用戶名和密碼,tomcat幫助認證有更高的效率。
type="javax.sql.DataSource" -- 連接類型
maxIdle="10" -- 初始化時連接數(shù)
maxActive="100" -- 最大連接數(shù)
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可以看見創(chuàng)建連接時的問題,當連接不上會顯示錯誤原因
/>
在項目上線的時候連接池一般是使用部署服務器的數(shù)據(jù)庫連接池,上面再Tomcat的配置中配置了連接池,然后下面在Java代碼中使用Tomcat的連接池的數(shù)據(jù)庫連接。
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;
/**
* 操作數(shù)據(jù)庫工具類
* @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";*/
/**
* 加載數(shù)據(jù)庫的靜態(tài)代碼塊
*/
/* static{
try {
Class.forName(JDBC_DRV);
} catch (ClassNotFoundException e) {
throw new DbException("加載數(shù)據(jù)庫驅動失敗!", 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("創(chuàng)建數(shù)據(jù)庫池時出錯", e);
}
}
/**
* 構造器,不允許創(chuàng)建對象
*/
private DbConfig() {
throw new AssertionError();
}
/**
* 建立數(shù)據(jù)庫連接
* @return 數(shù)據(jù)庫連接對象
*/
public static Connection getConnection(){
try {
//return DriverManager.getConnection(JDBC_URL, JDBC_UID, JDBC_PWD);
return dataSource.getConnection();
} catch (Exception e) {
throw new DbException("創(chuàng)建數(shù)據(jù)庫連接失敗!", 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);
}
}
/**
* 關閉數(shù)據(jù)庫連接
* @param con 需要關閉的數(shù)據(jù)庫連接
*/
public static void closeConnection(Connection con){
try {
if(con != null && !con.isClosed()) {
//多態(tài)
//使用數(shù)據(jù)庫連接池的con并不是mysql提供的con
//此處的close()并不是斷開連接,而是釋放連接池的連接,把連接歸還到連接池
con.close();
}
} catch (SQLException e) {
throw new DbException("關閉數(shù)據(jù)庫連接失敗!", e);
}
}
}