第八章 數(shù)據(jù)庫(kù)連接池
8.1 連接池介紹
數(shù)據(jù)庫(kù)連接池的概念:負(fù)責(zé)分配樊展、管理和釋放數(shù)據(jù)庫(kù)連接熏矿,它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫(kù)連接耙蔑,而不是再重新建立一個(gè)連接來(lái)操作數(shù)據(jù)庫(kù).
8.2 常見(jiàn)連接池
C3P0:比較古老的數(shù)據(jù)庫(kù)連接池
官網(wǎng)地址: https://www.mchange.com/projects/c3p0/
?
C3P0提供了多種創(chuàng)建數(shù)據(jù)庫(kù)連接的方式,根據(jù)官網(wǎng)任選其一即可
Druid:alibaba的基于Java的高效的數(shù)據(jù)庫(kù)連接池
官網(wǎng)地址: https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
8.3 C3P0連接池使用
ComboPooledDataSource pool = new ComboPooledDataSource();
pool.setDriverClass("com.mysql.jdbc.Driver");
pool.setJdbcUrl("jdbc:mysql://localhost:3306/jdbc");
pool.setUser("root");
pool.setPassword("root");
第九章 DBUtils工具類
9.1 DBUtils介紹
DBUtils是apache的一個(gè)組件,算是一個(gè)輕量級(jí)的JDBC框架,官網(wǎng)地址
?
https://commons.apache.org/proper/commons-dbutils/
?
DbUtils是一個(gè)非常小的類庫(kù),不需要花很長(zhǎng)的時(shí)間去看他的API類或者是接口蔬顾,只需要知道QueryRunner和ReulthSthand兩個(gè)/接口類即可
9.2 DBUtils使用
通過(guò)BeanHandler查詢一個(gè)ResultSet返回一個(gè)JavaBean對(duì)象(查詢單個(gè)對(duì)象)
QueryRunner run = new QueryRunner(dataSource);
?
ResultSetHandler<Person> h = new BeanHandler<Person>(Person.class);
?
Person p = run.query("SELECT * FROM Person WHERE name=?", h, "John Doe");
通過(guò)BeanListHandler查詢所有的ResultSet返回一組JavaBean列表
QueryRunner run = new QueryRunner(dataSource);
?
ResultSetHandler<List<Person>> h = new BeanListHandler<Person>(Person.class);
?
List<Person> persons = run.query("SELECT * FROM Person", h);
第十章 多線程安全問(wèn)題
當(dāng)前端多個(gè)用戶發(fā)送多個(gè)請(qǐng)求的時(shí)候,每一個(gè)請(qǐng)求都會(huì)建立一個(gè)數(shù)據(jù)庫(kù)連接,而一個(gè)用戶請(qǐng)求可能執(zhí)行多條SQL語(yǔ)句,多次操作數(shù)據(jù)庫(kù),在執(zhí)行多條SQL語(yǔ)句時(shí)怎么保證一個(gè)用戶請(qǐng)求在一個(gè)事務(wù)管理內(nèi)楚午,如果不能保證在一個(gè)事務(wù)管理中就會(huì)出現(xiàn)線程安全問(wèn)題昭齐,造成前后數(shù)據(jù)的不一致。保證線程安全的主要任務(wù)就是保證一個(gè)用戶請(qǐng)求中執(zhí)行的多條SQL語(yǔ)句在一個(gè)數(shù)據(jù)庫(kù)連接中即可.還有一種情況實(shí)在使用數(shù)據(jù)庫(kù)連接池時(shí)候矾柜,由于數(shù)據(jù)庫(kù)連接池的鏈接是可以共用的阱驾,在一個(gè)用戶請(qǐng)求過(guò)來(lái)的時(shí)候由于有異常產(chǎn)生而需要事物回滾操作,但是在事務(wù)還沒(méi)有來(lái)得及回滾的時(shí)候其他的請(qǐng)求使用了這個(gè)連接池里的連接怪蔑,進(jìn)行了提交里覆,這個(gè)時(shí)候在回滾就會(huì)沒(méi)有效果,造成的數(shù)據(jù)出錯(cuò)
解決方案
public class JdbcUtil {
private static ThreadLocal<Connection> pool = new ThreadLocal<>();
/**
* 獲取當(dāng)前請(qǐng)求線程上的Connection
* @return
*/
public static Connection getConnection() {
Connection conn = pool.get();
if(conn==null) {
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("", "", "");
pool.set(conn);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
return conn;
}
/**
* 關(guān)閉當(dāng)前請(qǐng)求線程上的Connection
*/
public static void close(){
? ? Connection conn = pool.get();
? ? conn.close();//關(guān)閉連接
? ? pool.remove();//移除連接
}
}