四種連接數據庫的方法(DriverManager、DataSource子類、DBCP、c3p0)???
一、環境?
???1、數據庫驅動jar文件????
2、DBCP方法?
Commons-dbcp.jar:連接池的實現?Commons-pool.jar:連接池實現的依賴庫?資源文件?
???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?{//?注冊驅動//?不要把conn?=?DriverManager.getConnection(url,?username,?password);//?放在這里。防止所有用戶都用一個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
?
模擬數據連接池?
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();????????????//創建對象就初始化size個數據庫連接????????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有兩種實現方式
1.直連數據庫方式?
1.當調用DataSource.getConnection()時,其實它調用的是DriverManager.getConnection(url, user, password)來獲取一個Connection,Connection使用完后被close,斷開與數據庫的連接,我們稱這總方式是直連數據庫,因為每次都需要重新建立與數據庫之間的連接,而并沒有把之前的Connection保留供下次使用.
2.池化連接方式?
1.可以說這種方式就是使用了連接池技術.DataSource內部封裝了一個連接池,當你獲取DataSource的時候,它已經敲敲的與數據庫建立了多個Connection,并將這些Connection放入了連接池,此時調用DataSource.getConnection()它從連接池里取一個Connection返回,Connection使用完后被close,但這個close并不是真正的與數據庫斷開連接,而是告訴連接池"我"已經被使用完,"你"可以把我分配給其它"人"使用了.就這樣連接池里的Connection被循環利用,避免了每次獲取Connection時重新去連接數據庫.
對DataSource的兩種實現方式已經介紹完畢,現在知道DataSource與連接池之間的是關系而不是區別了吧,因為DataSource與連接池根本就不是同一類型的東西,只有同一類型的東西才存在區別,例如:oracle與db2都是數據庫,它們才存在區別.
我們這里僅僅實現了數據庫的鏈接,并沒有池化鏈接
?
總結
以上是生活随笔為你收集整理的四种连接数据库的方法(DriverManager、DataSource子类、DBCP、c3p0)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。