四種連接數(shù)據(jù)庫的方法(DriverManager、DataSource子類、DBCP、c3p0)???
一、環(huán)境?
???1、數(shù)據(jù)庫驅(qū)動(dòng)jar文件????
2、DBCP方法?
Commons-dbcp.jar:連接池的實(shí)現(xiàn)?Commons-pool.jar:連接池實(shí)現(xiàn)的依賴庫?資源文件?
???3、c3p0方法:?c3p0-0.9.1.2.jar?
配置文件:c3p0-config.xml?二、連接操作?1.DriverManager方法;?import?java.sql.Connection;???
package?demo.jdbcpool.test1;
import?java.sql.Connection;
import?java.sql.DriverManager;
import?java.sql.SQLException;
public?class?DBConnection?{private?static?String?driverClass?=?"com.mysql.jdbc.Driver";private?static?String?url?=?"jdbc:mysql://localhost:3306/test";private?static?String?username?=?"root";private?static?String?password?=?"123456";private?static?Connection?conn?=?null;static?{try?{//?注冊(cè)驅(qū)動(dòng)//?不要把conn?=?DriverManager.getConnection(url,?username,?password);//?放在這里。防止所有用戶都用一個(gè)ConnectionClass.forName(driverClass);}?catch?(Exception?e)?{throw?new?RuntimeException(e);}}public?static?Connection?getConnection()?throws?SQLException?{conn?=?DriverManager.getConnection(url,?username,?password);return?conn;}
}
??
2.使用DataSource子類方法;?
資源文件DBConnection.properties????
driverClass?=?com.mysql.jdbc.Driver????
url?=?jdbc:mysql://localhost:3306/test??
username?=?root????
password?=?123456
?
模擬數(shù)據(jù)連接池?
DataSourcePool.java??
package?cn.langzi.jdbc.DataSource;?
import?java.io.InputStream;???????
import?java.io.PrintWriter;?
import?java.lang.reflect.InvocationHandler;????????
import?java.lang.reflect.Method;????????
import?java.lang.reflect.Proxy;????????
import?java.sql.Connection;????????
import?java.sql.DriverManager;????????
import?java.sql.SQLException;????????
import?java.util.LinkedList;????????
import?java.util.Properties;????????
import?javax.sql.DataSource;????????
import?javax.sql.DataSource;?public?class?DataSourcePool?implements?DataSource?{?private?static?String?url?=?null;?????????private?static?String?username?=?null;????????private?static?String?password?=?null;?????private?static?int?size?=?10;?????private?static?LinkedList<Connection>?list?=?new?LinkedList<Connection>();?????????
static{try?{?????????????????InputStream?in?=?DataSourcePool.class.getClassLoader()???????????????????????.getResourceAsStream???????("cn/langzi/jdbc/DataSource/DBConnection.properties");??????????????Properties?prop?=?new?Properties();???????????????????prop.load(in);????????????????Class.forName(prop.getProperty("driverClass"));?????????????????url?=?prop.getProperty("url");?????????????????username?=?prop.getProperty("username");?????????????????password?=?prop.getProperty("password");????????????????}?catch?(Exception?e)?{????????????????????throw?new?ExceptionInInitializerError(e);??????????????????}?????????}?????????private?static?DataSourcePool?pool?=?new?DataSourcePool();????????????//創(chuàng)建對(duì)象就初始化size個(gè)數(shù)據(jù)庫連接????????private?DataSourcePool(){?????????????for(int?i=0;i<size;i++){try?{???????????????????Connection?conn?=?DriverManager.getConnection(url,?username,?password);???????????????????System.out.println(conn);?????????????????????????list.add(conn);???????????????????}?catch?(SQLException?e)?{??????????????????????????????e.printStackTrace();}?
}
?
DataSource有兩種實(shí)現(xiàn)方式
1.直連數(shù)據(jù)庫方式?
1.當(dāng)調(diào)用DataSource.getConnection()時(shí),其實(shí)它調(diào)用的是DriverManager.getConnection(url, user, password)來獲取一個(gè)Connection,Connection使用完后被close,斷開與數(shù)據(jù)庫的連接,我們稱這總方式是直連數(shù)據(jù)庫,因?yàn)槊看味夹枰匦陆⑴c數(shù)據(jù)庫之間的連接,而并沒有把之前的Connection保留供下次使用.
2.池化連接方式?
1.可以說這種方式就是使用了連接池技術(shù).DataSource內(nèi)部封裝了一個(gè)連接池,當(dāng)你獲取DataSource的時(shí)候,它已經(jīng)敲敲的與數(shù)據(jù)庫建立了多個(gè)Connection,并將這些Connection放入了連接池,此時(shí)調(diào)用DataSource.getConnection()它從連接池里取一個(gè)Connection返回,Connection使用完后被close,但這個(gè)close并不是真正的與數(shù)據(jù)庫斷開連接,而是告訴連接池"我"已經(jīng)被使用完,"你"可以把我分配給其它"人"使用了.就這樣連接池里的Connection被循環(huán)利用,避免了每次獲取Connection時(shí)重新去連接數(shù)據(jù)庫.
對(duì)DataSource的兩種實(shí)現(xiàn)方式已經(jīng)介紹完畢,現(xiàn)在知道DataSource與連接池之間的是關(guān)系而不是區(qū)別了吧,因?yàn)镈ataSource與連接池根本就不是同一類型的東西,只有同一類型的東西才存在區(qū)別,例如:oracle與db2都是數(shù)據(jù)庫,它們才存在區(qū)別.
我們這里僅僅實(shí)現(xiàn)了數(shù)據(jù)庫的鏈接,并沒有池化鏈接
?
總結(jié)
以上是生活随笔為你收集整理的四种连接数据库的方法(DriverManager、DataSource子类、DBCP、c3p0)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。