傳統方式和連接池方式
傳統方式的步驟
使用傳統方式在Java中使用JDBC連接資料庫,完成一次資料庫的操作,一般有以下步驟:
1. 載入驅動程式。
2. 建立連線。
3. 執行SQL語句。
4. 釋放連線。
5. 傳統方式的弊端
每一次對資料庫的操作都要建立一次連接,並且會將得到的Connection物件載入到記憶體中,導致消耗了大量的記憶體和時間。如果短時間有很多需要建立連線的操作,會導致佔用很多系統資源,甚至會導致伺服器崩潰。
同建立連接相對應,每次使用都需要手動釋放連接,如果忘記釋放連接或程式出現異常未能成功釋放,會導致記憶體外洩。
此外,傳統方式並不能控制連線的數量,如果連線的人數過多,會導致無限制的建立連線對象,導致記憶體開銷過大,伺服器崩潰。
(推薦影片:java影片教學)
連接池的步驟
1. 建立連線池並設定連接屬性。
2. 使用連線池取得連線。
連接池的優勢
每次需要連接資料庫時,不需要建立連接,而是透過連接池獲取,由連接池提供連接。
使用完連接後,不需要手動釋放連接,而是交由連接池釋放連接。
可以透過連線池控制連線的數量,在連線池裡的連線可重複使用,避免了無限制建立連線的問題。
使用連接池
使用C3P0資料庫連接池
匯入jar套件:
c3p0-0.9.5.2.jar
在目前專案的程式碼根目錄src 下新建名為 c3p0-config.xml 的設定文件,注意檔案名稱無法改變,內容如下:
<c3p0-config> <!-- 连接名称 --> <named-config name="mysql"> <!-- 接数据库的驱动类名 --> <property name="driverClass">com.mysql.jdbc.Driver</property> <!-- 连接属性 --> <property name="jdbcUrl">jdbc:mysql://192.168.35.128:3306/demo</property> <property name="user">root</property> <property name="password">123456</property> <!-- 当连接池用完时等待获取新连接的时间,超时后将抛出SQLException,单位毫秒,如设为0则无限期等待。默认为0。 --> <property name="checkoutTimeout">5000</property> <!-- 当连接用尽后,一次获取的连接个数 --> <property name="acquireIncrement">2</property> <!-- 初始连接数 --> <property name="initialPoolSize">1</property> <!-- 最小连接数 --> <property name="minPoolSize">3</property> <!-- 最大连接数 --> <property name="maxPoolSize">5</property> </named-config> </c3p0-config>
程式碼:
public class TestDataPool { // 根据配置文件里的名称创建连接池 public static ComboPooledDataSource cpds = new ComboPooledDataSource("mysql"); /** * 主程序 */ public static void main(String[] args) { // 模拟多次对数据库的查询操作 for (int i = 0; i < 6; i++) { new Thread(new Runnable() { @Override public void run() { select(); } }, "线程" + i).start(); } } /** * 查询程序 */ public static void select() { Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; // 获取连接并执行SQL try { conn = cpds.getConnection(); pstmt = conn.prepareStatement("select * from student where id = 906"); rs = pstmt.executeQuery(); while (rs.next()) { System.out.println(Thread.currentThread().getName() + "\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString("address")); } } catch (Exception e) { e.printStackTrace(); } finally { // 释放资源 try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } try { pstmt.close(); } catch (SQLException e) { e.printStackTrace(); } try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
使用DBCP資料庫連線池
匯入jar包:
commons-dbcp-1.4.jar2 commons-pool-1.5.5.jar
在目前專案的程式碼根目錄 src 下新建名為 dbcp.properties 的設定文件,檔案名稱需要同程式碼中引用的檔案名稱一致,內容如下:
# 接数据库的驱动类名 driverClassName=com.mysql.jdbc.Driver # 连接属性 url=jdbc:mysql://192.168.35.128:3306/demo username=root password=123456 # 初始化连接数 initialSize=10 # 最大连接数 maxActive=15
程式碼:
public class TestDBCP { // 根据配置文件里的名称创建连接池 private static DataSource source = null; static { Properties pros = new Properties(); InputStream is = TestDBCP.class.getClassLoader().getResourceAsStream("dbcp.properties"); try { pros.load(is); source = BasicDataSourceFactory.createDataSource(pros); } catch (Exception e) { e.printStackTrace(); } } /** * 主程序 */ public static void main(String[] args) { // 模拟多次对数据库的查询操作 for (int i = 0; i < 6; i++) { new Thread(new Runnable() { @Override public void run() { select(); } }, "线程" + i).start(); } } /** * 查询程序 */ public static void select() { Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; // 获取连接并执行SQL try { conn = source.getConnection(); pstmt = conn.prepareStatement("select * from student where id = 906"); rs = pstmt.executeQuery(); while (rs.next()) { System.out.println(Thread.currentThread().getName() + "\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString("address")); } } catch (Exception e) { e.printStackTrace(); } finally { // 释放资源 try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } try { pstmt.close(); } catch (SQLException e) { e.printStackTrace(); } try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
以上是Java操作資料庫-使用連線池連接資料庫的詳細內容。更多資訊請關注PHP中文網其他相關文章!