現在的位置: 首頁 > 綜合 > 正文

Tomcat配置連接池

2018年06月05日 ⁄ 綜合 ⁄ 共 2262字 ⁄ 字型大小 評論關閉

在我們做項目的時候連接資料庫一般採用兩種方式

1:應用程序直接獲取資料庫連接

2:通過資料庫連接池獲取連接

第一種方法是用戶每次請求都需要向資料庫獲得連接,這樣有一個很大的缺點,就是資料庫創建連接通常需要消耗相對較大的資源,創建時間也較長。如果網站一天的訪問量大的話,就會極大浪費資料庫資源,並且極易造成資料庫伺服器內存溢出、宕機。直接從資料庫獲取連接的示意圖:

然而採用資料庫連接池就可以很好的解決這個問題,採用資料庫連接池獲取數據連接的過程如下:

下面介紹如何在tomcat容器中配置數據源

1.找到tomcat所在目錄中的conf文件夾中的context.xml文件,在其中做修改(在Context結點裡面添加):

<!—mysql數據源配置-->
    <Resource
       name="ds_mysql"
       auth="Container"
       type="javax.sql.DataSource"
       maxActive="100"
       maxIdel="30"
       maxWait="10000"
       username="root"
       password="5982285"
       driverClassName="com.mysql.jdbc.Driver"
       url="jdbc:mysql://localhost/myblog"
    />
    <!—oracle數據源配置-->
    <Resource
       name="jdbc/oracleds"
       auth="Container"
       type="javax.sql.DataSource"
       maxActive="100"
       maxIdel="30"
       maxWait="10000"
       username="scott"
       password="tiger"
       driverClassName="oracle.jdbc.driver.OracleDriver"
       url="jdbc:oracle:thin:@localhost:1521:sky"
    />

註:上面為mysql和Oracle配置了數據源,看個人需求而定,二者選其一。

屬性說明:

name:數據源名稱,這個隨便,通常取為jdbc/XXX的格式

auth:Container容器

type:javax.sql.DataSource 注意是javax不是java

username:資料庫用戶名

password:資料庫用戶密碼

maxIdle:最大空閑數,資料庫連接的最大空閑時間。超過空閑時間,資料庫連接將被標記為不可用,然後被釋放。設為0表示無限制。

maxActive:連接池的最大資料庫連接數。設為0表示無限制。

maxWait:最大建立連接等待時間。設為-1表示無限制。

driverClassName:資料庫完整的驅動類全稱。

url:資料庫鏈接

註:網上很多人都說需要在web.xml文件中再次配置,其實不配置也是可以的(本人就沒有在web.xml配置,依然跑的很溜),另外有一個要特別注意的是要將數據源的jar包和資料庫的驅動包放到tomcat的lib包中。

JNDI技術簡介

JNDI(Java Naming and Directory Interface)即Java命名和目錄介面,它對應於Java EE中的javax.naming包,這套API的主要作用:它可以把DataSource對象放在一個Tomcat容器中(JNDI容器),並為容器中的DataSource對象取一個名稱,以後程序想獲得DataSource對象,只需要通過名稱檢索即可。

JNDI的核心API為Context,它代表JNDI容器,核心方法是lookup()它的功能是檢索容器中對應名稱的對象。

連接池工具類:

/**
 * 獲取資料庫連接的工廠
 * @author Liao
 */
public class ConnectionFactory {

	private static DataSource dataSource;
	
	static {
		try {
			//初始化查找命名空間
			Context context = new InitialContext();
			//找到DataSource
			dataSource = (DataSource) context.lookup("java:comp/env/ds_mysql");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 獲取資料庫連接
	 */
	public static Connection getConnection(){
		try {
			//通過數據源獲取連接然後返回
			return dataSource.getConnection();
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 關閉資源
	 * @param conn
	 * @param sta
	 * @param res
	 */
	public static void closeConnection(Statement sta, ResultSet res) {
		try {
			if (res != null) {
				res.close();
				res = null;
			}
			if (sta != null) {
				sta.close();
				sta = null;
			}

		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

註:這裡的close並不是真正的關閉,連接又回到了連接池,處於空閑狀態。

連接池配置常見錯誤:
Invalid byte 1 of 1-byte UTF-8 sequence.

原因:

在context.xml文件中使用了中文的注釋(這個確實比較坑爹,但確實是這樣的)。

解決方案:

把中文的注釋去掉即可。

抱歉!評論已關閉.