什么是數據庫連接池?
配置連接池為的是解決效率問題.由於每創建一個連接都是非常耗時的,有了連接池,就能夠提前放一些連接進去.以后我們再用連接就去連接池里面取而不是每次都創建.可是我們知道連接池是有上限的,假設僅僅同意我們放10個,那么當這10個連接都被占用的時候,下一個用戶再來請求連接將不能得到,僅僅好等待,假設等的時間太長了就會拋出timeout的異常.使用完連接后要釋放,否則會一直占着資源,當連接所有被占用而得不到釋放時,就會出現錯誤...
JBoss實現了J2EE的13個規范包含JNDI,JNDI採用樹形結構管理我們的對象,tomcat和JBoss等server對JNDI做了實現,實現它之后能夠管理對象.
採用JNDI能夠使我們的應用和實際實現解耦,如,我們的應用中僅僅管從連接池中取連接,而不用管使用的是哪個連接池實現,連接池的實現對我們是透明的.也就是說,我們使用連接池時,根本沒有寫dbcp(dbcp實現了DataSource接口),我們也不知道它是dbcp.我們僅僅管使用連接不須要考慮連接是怎樣被創建的.對於我們來說這就像是一個工廠,隱藏了創建的細節.所以,這就是面向接口編程.我們拿到DataSource接口就OK了.
以下我們看看數據源是怎樣在JBoss注冊的,我們又是怎樣從連接池取連接的?
在JBoss的standalone.xml配置文件<datasources></datasources>節點中配置數據源,代碼例如以下:
<datasource jta="true" jndi-name="java:jboss/datasources/PjMysqlDS" pool-name="PjMysqlDS" enabled="true" use-java-context="true"> <connection-url>jdbc:mysql://192.168.24.118:3306/itoo_assess?useUnicode=true&characterEncoding=UTF-8</connection-url> <driver>mysql</driver> <pool> <prefill>false</prefill> <use-strict-min>false</use-strict-min> <flush-strategy>FailingConnectionOnly</flush-strategy> </pool> <security> <user-name>root</user-name> <password>888888</password> </security> </datasource>
public Connection getConnection{ Connection conn=null; PreparedStatement pstmt=null; try{ Context ctx=new InitialContext(); //通過JNDI查找DataSource DataSource ds=(DataSource)ctx.lookup("java:jboss/datasources/PjMysqlDS"); conn=ds.getConnection(); }catch(Exception e){ e.printStackTrace(); } return conn; }
JNDI另一個典型的應用,即分布式對象的訪問.如EJB. 把對象注冊到這棵樹上,起個名,遠程lookup這個服務,僅僅要知道這個服務所處機器的IP和port號,就能夠將這個服務傳到client的本地.
知識都是連通的,當我們可以熟練地從一個跳到還有一個就說明我們會學了.