連接數據庫,使用c3p0技術連接MySQL數據庫


讀取配置文件連接MySQL數據庫

先確認已經導入了 mysql 的驅動包

db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/v20?useUnicode=true&characterEncoding=utf8
username=root
password=123456

JdbcUtil.java

package com.stu_mvc.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;


public class JdbcUtil {

	private static String CLASS_DRIVER = "";
	private static String URL = "";
	private static String USERNAME = "";
	private static String PASSWORD = "";

	static {
		Properties properties = new Properties();
		try {
            //讀取上面的配置文件
			properties.load(JdbcUtil.class.getResourceAsStream("/db.properties"));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		CLASS_DRIVER = properties.getProperty("driver");
		URL = properties.getProperty("url");
		USERNAME = properties.getProperty("username");
		PASSWORD = properties.getProperty("password");
		try {
			Class.forName(CLASS_DRIVER);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

    /**
     *	getConn()
     *	獲取conn
     */
	public static Connection getConn() {
		Connection conn = null;
		try {
			conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
		} catch (SQLException e) {

			e.printStackTrace();
		}
		return conn;

	}

	/**
	 * 利用泛型改進釋放資源 rs,st,conn
	 */
	public static <T extends AutoCloseable> void closeAll(T... autos) {
		for (AutoCloseable t : autos) {
			if (t != null) {
				try {
					t.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}
}


使用 c3p0數據庫連接池連接MySQL

普通的數據庫連接創建的缺點:

用戶每次請求都需要向數據庫獲得鏈接,而數據庫創建連接通常需要消耗相對較大的資源,創建時間也較長。

數據庫連接池概念

所謂數據庫連接池,可以看作 :在用戶和數據庫之間創建一個”池”,這個池中有若干個連接對象,當用戶想要連接數據庫,就要先從連接池中獲取連接對象,然后操作數據庫。一旦連接池中的連接對象被拿光了,下一個想要操作數據庫的用戶必須等待,等待其他用戶釋放連接對象,把它放回連接池中,這時候等待的用戶才能獲取連接對象,從而操作數據庫。

下載C3P0工具包

C3P0工具包包含的版本:

  • c3p0-0.9.5.2

  • mchange-commons-java-0.2.11

c3p0-config.xml 的配置

**注意: ** xml 配置文件的名稱必須是:c3p0-config.xml ,也是放在src 目錄下

這里的 jdbcUrl 比較容易出問題,要是出現問題,建議仔細找找。

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
	<!-- 文件名字是固定的,連接池會找到這個配置文件進行配置 -->
	<default-config>
		<!--第一條內容是固定的-->
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<!--最后一項改成你的數據庫名字即可,我這里之前總是連接不上,改成三個 /// 后發現連接成功-->
		<property name="jdbcUrl">jdbc:mysql:///v20</property>
		<!--mysql的用戶名和密碼-->
		<property name="user">root</property>
		<property name="password">123456</property>
	</default-config>
</c3p0-config>

JdbcUtil.java

寫一個封裝的工具類,開發起來還不是美滋滋!

package com.register_mvc.utils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.mchange.v2.c3p0.impl.DbAuth;

public class JdbcUtil {
    // 創建 c3p0 連接池對象
    static ComboPooledDataSource dataSource = new ComboPooledDataSource("v20");
    //創建一個 ThreadLocal 
    static ThreadLocal<Connection> th = new ThreadLocal<Connection>();

    /**
     *	getConn()
     *	獲取conn
     */
    public static Connection getConn() {
        // 從連接池中獲取連接
        // 先從 th 中獲取,如果為空再到連接池中獲取
        Connection conn = th.get();
        if (conn == null) {
            try {
                //把 獲取的conn 存到 ThreadLocal 中
                // ThreadLocal 內部有個map
                // 通過當前的 線程 作為 key  value 是存的內容 
                // 統一線程  key一致  value值 肯定一致  
                conn = dataSource.getConnection();
                //把 conn存到th中 
                th.set(conn);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return conn;
    }

	/**
	 * 利用泛型方法釋放資源 rs,st,conn
	 */
	public static <T extends AutoCloseable> void closeAll(T... autos) {
		for (AutoCloseable t : autos) {
			if (t != null) {
				try {
					t.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM