開源數據庫連接池的使用
上篇博客剛剛說完如何去自定義一個數據庫連接池,當然,這個自定義的數據庫連接池是十分簡易的,憑借自己的能力也無法寫出優秀的連接池。但是,不用擔心,我們可以使用開源的數據庫連接池,開源的優勢體現于此。
在Java中有三種開源數據庫連接池提供了數據源的獨立實現:
DBCP 數據庫連接池
C3P0 數據庫連接池
Apache Tomcat內置的連接池(apache dbcp)
DBCP是Apache軟件基金組織下的開源連接池實現,使用DBCP數據源,應用程序應在系統中增加如下兩個jar文件:
commons-dbcp.jar
commons-pool.jar
很多小伙伴因為沒有積分,導致很多在CSDN上的資源都無法下載,以后,我都會把資源通過百度網盤分享給大家,大家有需要都可以免費下載。今天的jar包資源我也放在了網盤上。鏈接:https://pan.baidu.com/s/1-Rj4TQLI_5DGLdfb45N62g
提取碼:ba3a
復制這段內容后打開百度網盤手機App,操作更方便哦
jar包準備好了,那么我們來使用一下。
新建一個Java項目。
然后新建測試類DBCPTest,編寫測試代碼
@Test public void demo1(){ //首先使用BasicDataSource創建連接池 BasicDataSource basicDataSource = new BasicDataSource(); try { //從連接池中獲取連接 Connection connection = basicDataSource.getConnection(); String sql = "select * from account"; PreparedStatement stmt = connection.prepareStatement(sql); ResultSet set = stmt.executeQuery(); while(set.next()){ System.out.println(set.getString("name")); } //釋放資源 JDBCUtils.release(stmt, connection); } catch (SQLException e) { e.printStackTrace(); } }
現在運行測試代碼,能查詢出表數據嗎?
很顯然,連數據庫參數都沒給,這段測試代碼肯定會報錯。
那現在就來設置一下參數,修改測試代碼
@Test public void demo1(){ //首先使用BasicDataSource創建連接池 BasicDataSource basicDataSource = new BasicDataSource(); //創建連接需要四個參數 basicDataSource.setDriverClassName("com.mysql.jdbc.Driver"); basicDataSource.setUrl("jdbc:mysql:///test"); basicDataSource.setUsername("root"); basicDataSource.setPassword("123456"); try { //從連接池中獲取連接 Connection connection = basicDataSource.getConnection(); String sql = "select * from account"; PreparedStatement stmt = connection.prepareStatement(sql); ResultSet set = stmt.executeQuery(); while(set.next()){ System.out.println(set.getString("name")); } //釋放資源 JDBCUtils.release(stmt, connection); } catch (SQLException e) { e.printStackTrace(); } }
現在運行測試代碼
成功查詢到表數據。但是這樣寫具有局限性,應該把數據庫參數寫成配置文件,以適應靈活多變的用戶需求。
在src目錄下新建配置文件dbcp.properties
driverClassName = com.mysql.jdbc.Driver url = jdbc:mysql:///test username = root password =123456
編寫測試代碼
@Test public void demo2() throws Exception{ //讀取dbcp.properties Properties properties = new Properties(); properties.load(new FileInputStream(this.getClass().getResource("/dbcp.properties").getFile())); DataSource dataSource = BasicDataSourceFactory.createDataSource(properties); //從連接池中獲取連接 Connection connection = dataSource.getConnection(); String sql = "select * from account"; PreparedStatement stmt = connection.prepareStatement(sql); ResultSet set = stmt.executeQuery(); while(set.next()){ System.out.println(set.getString("name")); } //釋放資源 JDBCUtils.release(stmt, connection); }
然后運行
運行成功。
附上一個比較全面的配置文件。
#連接設置 driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/jdbc username=root password= # initialSize=10 #最大連接數量 maxActive=50 # maxIdle=20 # minIdle=5 # maxWait=60000 #JDBC驅動建立連接時附帶的連接屬性屬性的格式必須為這樣:[屬性名=property;] #注意:"user" 與 "password" 兩個屬性會被明確地傳遞,因此這里不需要包含他們。 connectionProperties=useUnicode=true;characterEncoding=gbk #指定由連接池所創建的連接的自動提交(auto-commit)狀態。 defaultAutoCommit=true #driver default 指定由連接池所創建的連接的事務級別(TransactionIsolation)。 #可用值為下列之一:(詳情可見javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE defaultTransactionIsolation=READ_UNCOMMITTED
jar包-:https://sourceforge.net/projects/c3p0/
官網地址:https://www.mchange.com/projects/c3p0/
官網里面也有下載入口,和數據庫連接池的使用教程。
官網的文檔教程十分詳細,所以也就不過多贅述了。
直接上案例。
編寫測試代碼
@Test public void demo1() throws Exception{ //創建一個連接池 ComboPooledDataSource dataSource = new ComboPooledDataSource(); //設置四個參數 dataSource.setDriverClass("com.mysql.jdbc.Driver"); dataSource.setJdbcUrl("jdbc:mysql:///test"); dataSource.setUser("root"); dataSource.setPassword("123456"); Connection connection = dataSource.getConnection(); String sql = "select * from account"; PreparedStatement stmt = connection.prepareStatement(sql); ResultSet set = stmt.executeQuery(); while(set.next()){ System.out.println(set.getString("name")); } JDBCUtils.release(stmt, connection); }
需要注意的是,如果運行時報ClassNotFoundExecption異常,說明你的jar包版本是c3p0-0.9.2之后的,該版本之后的版本還需要添加一個輔助包,mchange-commons-java-0.2.3.4.jar。
這是jar包的-。鏈接:https://pan.baidu.com/s/17o0s92Us-UPQPJFeJjpOzQ
提取碼:lt2v
復制這段內容后打開百度網盤手機App,操作更方便哦
同樣地,用配置文件實現一下。
在src目錄新建文件c3p0-config.xml
這是直接從官方文檔上復制下來的。然后加上了數據庫配置所需要的四個參數。
然后編寫測試代碼
@Test public void demo2() throws Exception{ //使用c3p0配置文件 ComboPooledDataSource dataSource = new ComboPooledDataSource(); Connection connection = dataSource.getConnection(); String sql = "select * from account"; PreparedStatement stmt = connection.prepareStatement(sql); ResultSet set = stmt.executeQuery(); while(set.next()){ System.out.println(set.getString("name")); } JDBCUtils.release(stmt, connection); }
注意,c3p0數據庫連接池是不需要自己手動加載配置文件的,c3p0非常的人性化,這一步已經被封裝好了。創建ComboPooledDataSource對象后直接調用getConnection()方法即可獲得連接。前提是你的配置文件名字必須為c3p0-config.xml,且該文件必須放在src目錄下。至于其它的一些配置信息,在文檔都有講解,大家可以自行閱讀學習。
創建ComboPooledDataSource 對象有兩種方法,調用無參構造使用的是配置文件中默認的配置,而如果調用有參構造,將配置文件中標簽的name屬性值傳入,將會使用該標簽內的配置信息。
需要知道的是,Tomcat內容連接池就是DBCP。
我們知道,將web工程部署到Tomcat有三種方式:
配置server.xml,添加標簽
配置獨立的xml文件,添加標簽
直接將網站目錄復制到Tomcat的webapps目錄下
任何工程要能夠在Tomcat運行,都需要一個虛擬目錄。虛擬目錄指的是什么?指的就是Context元素。當我們需要使用連接池時,就需要對Context作如下配置
這是從官網上復制下來的。
那么該在哪里配置Context元素呢?
配置Context元素的三個位置:
Tomcat安裝目錄/conf/context.xml(如果將連接池配置到了該文件,就會對當前Tomcat內部所有的虛擬主機中的任何工程都有效)
Tomcat安裝目錄/conf/Catalina/虛擬主機目錄/context.xml(如果將連接池配置到了該文件,就會對當前虛擬主機的任何工程都有效)
web工程的根目錄/META-INF/context.xml(如果將連接池配置到了該文件,將只對當前工程有效)
接下來演示一下第三種配置方式
在WebRoot下的META-INF文件夾中新建一個文件context.xml
context.xml文件編寫完成后,在啟動Tomcat服務器的時候,Tomcat會去自動加載該文件,并創建數據庫連接池,存放在Tomcat容器中。此時我們將可以使用JNDI技術去訪問數據庫連接池。
不了解JNDI技術的童鞋,我們可以在這里略微提一下
JNDI(Java Naming and Directory Interface),Java命名和目錄接口,它對應于J2SE中的javax.naming包,
這套API的主要作用在于:它可以把Java對象放在一個容器中(支持JNDI容器 Tomcat),并為容器中的java對象取一個名稱,以后程序想獲得Java對象,只需通過名稱檢索即可。
其核心API為Context,它代表JNDI容器,其lookup方法為檢索容器中對應名稱的對象。
注意事項:
Tomcat創建連接池,與數據庫連接需要數據庫驅動,要將mysql.jar復制到Tomcat目錄下的lib文件夾中。
Java程序要想通過JNDI訪問對象,就必須運行在同一個JNDI容器中。也就是說,該Java程序必須運行在Tomcat內部,所以使用JNDI的程序一般是Servlet或JSP。
演示一下。
在項目中新建一個Servlet文件為TomcatServlet
/** * 在該程序中,通過JNDI訪問Tomcat內部的連接池 * @author Administrator * */ public class TomcatServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { //創建一個檢索的對象 Context initCtx = new InitialContext(); //默認查找頂級的Java名稱串 這是固定的:java:comp/env Context envCtx = (Context) initCtx.lookup("java:comp/env"); //根據設置名稱查找連接池對象 DataSource ds = (DataSource) envCtx.lookup("jdbc/TestDB"); //獲得連接池中的一個連接 Connection conn = ds.getConnection(); String sql = "select * from account"; PreparedStatement stmt = conn.prepareStatement(sql); ResultSet set = stmt.executeQuery(); while(set.next()){ System.out.println(set.getString("name")); } JDBCUtils.release(stmt, conn); } catch (NamingException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
千萬別忘了數據庫驅動,將mysql-connector-java-5.1.47-bin.jar復制到Tomcat安裝目錄下的lib文件夾中,然后在MyEclipse中部署項目并運行。接著在瀏覽器中訪問Servlet程序
說明查詢成功。
Java Tomcat 數據庫
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。