開源數據鏈接池

l 使用數據庫連接池優化程序性能

spacer.gif

spacer.gif

數據庫連接池原理:

  一次性創建多個連接,將多個連接緩存在內存中 ,形成數據庫連接池(內存數據庫連接集合),如果應用程序需要操作數據庫,只需要從連接池中獲取一個連接,使用後,關閉連接的同時,將連接放回到連接池中。




DBCP數據源:

需要使用的jar包:

Commons-dbcp.jar:連接池的實現

Commons-pool.jar:連接池實現的依賴庫

需要使用的類:

1:BasicDataSource 直接使用其無參構造器(基本上沒用)

1):void setDriverClassName(com.mysql.jdbc.Driver);

2):void setUrl(jdbc:mysql:///DataBase);

3):void setUsername(“”);

4):void setPassword(“”);

5)Connection getConnection();

2:BasicDataSourceFactory 直接使用其構造器,配置文件

常見設置:

#連接設置

driverClassName=com.mysql.jdbc.Driver

url=jdbc:mysql://localhost:3306/jdbc

username=root

password=

#<!-- 初始化連接 -->

initialSize=10

#最大連接數量

maxActive=50

#<!-- 最大空閒連接 -->

maxIdle=20

#<!-- 最小空閒連接 -->

minIdle=5

#<!-- 超時等待時間以毫秒爲單位 6000毫秒/1000等於60秒 -->

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
1) DataSource createDataSource(Properties properties)


C3P0數據源:

ComboPooledDataSource類

構造方法:new ComboPooledDataSource()

ComboPooledDataSource cpds = new ComboPooledDataSource(); cpds.setDriverClass("com.mysql.jdbc.Driver");

cpds.setJdbcUrl("jdbc:mysql://localhost/database"); cpds.setUser("xxx);

cpds.setPassword("xxx");

Connection conn = cpds.getConnection();



使用配置文件

By default, c3p0 will look for an XML configuration file in its classloader's resource path under the name "/c3p0-config.xml"

模板:

<c3p0-config>

<default-config>

<propertyname="automaticTestTable">con_test</property>   <property name="checkoutTimeout">30000</property>

<property name="idleConnectionTestPeriod">30</property> <property name="initialPoolSize">10</property>

<property name="maxIdleTime">30</property>

<property name="maxPoolSize">100</property>

<property name="minPoolSize">10</property>

<property name="maxStatements">200</property> <user-overrides user="test-user">

<property name="maxPoolSize">10</property>

<property name="minPoolSize">1</property>

<property name="maxStatements">0</property> </user-overrides>

</default-config>

<!-- This app is massive! -->

<named-config name="intergalactoApp">

<property name="acquireIncrement">50</property>

<property name="initialPoolSize">100</property>

<property name="minPoolSize">50</property>

<property name="maxPoolSize">1000</property>

<!-- intergalactoApp adopts a different approach to configuring statement caching -->

<property name="maxStatements">0</property>

<property name="maxStatementsPerConnection">5</property> <!-- he's important, but there's only one of him --> <user-overrides user="master-of-the-universe">

<property name="acquireIncrement">1</property>

<property name="initialPoolSize">1</property>

<property name="minPoolSize">1</property>

<property name="maxPoolSize">5</property>

<property name="maxStatementsPerConnection">50</property> </user-overrides>

</named-config>

</c3p0-config>

如果配置了xml文件,使用無參構造器,會默認讀取配置文件中的信息,<default-config>,可以通過構造器指定要使用哪一個<name-config name=””>中配置的信息

<?xmlversion="1.0"encoding="UTF-8"?>

<c3p0-config>

<default-config>

<propertyname="driverClass">com.mysql.jdbc.Driver</property>

<propertyname="jdbcUrl">jdbc:mysql:///mydb</property>

<propertyname="user">root</property>

<propertyname="password">root</property>

</default-config>

<name-configname="mysql">

<propertyname="driverClass">com.mysql.jdbc.Driver</property>

<propertyname="jdbcUrl">jdbc:mysql:///mydb</property>

<propertyname="user">root</property>

<propertyname="password">root</property>

</name-config>

</c3p0-config>


publicvoid fun2() throws SQLException

{

//ComboPooledDataSource dataSource = new ComboPooledDataSource();

ComboPooledDataSource dataSource = new ComboPooledDataSource("mysql");

Connection conn = dataSource.getConnection();

Statement ps = conn.createStatement();

ResultSet set = ps.executeQuery("select * from test1");

while(set.next())

{

String name = set.getString("name");

System.out.println(name);

}

set.close();

ps.close();

conn.close();

}

配置更多信息:

Configuration

· acquireIncrement 當連接池中沒有連接時,連接池自動獲取連接時,一次獲取的連接個數

· initialPoolSize 連接池初始化時獲取連接的個數

· maxPoolSize 連接池可以保留的最大連接數量

· maxIdleTime 當連接池空閒多就是釋放連接,如果時間值爲0,表示不釋放連接

· minPoolSize 連接池保有的最少連接數量


l JNDI技術簡介

1) JNDI(Java Naming and Directory Interface),Java命名和目錄接口,它對應於J2SE中的javax.naming包

2) 這套API的主要作用在於:它可以把Java對象放在一個容器中(支持JNDI容器 Tomcat),併爲容器中的java對象取一個名稱,以後程序想獲得Java對象,只需通過名稱檢索即可。

3) 其核心API爲Context,它代表JNDI容器,其lookup方法爲檢索容器中對應名稱的對象。



Tomcat數據源

原理:底層是dbcp,基於jndi技術工作

---------------------------------


Jndi:Java命名和目錄接口

本身是一個容器,允許名字和值的方式在其中配置屬性,

操作步驟

1、配置使用tomcat 內置連接池 配置<context> 元素

context元素有三種常見配置位置

1) tomcat/conf/context.xml 所有虛擬主機,所有工程都可以訪問該連接池

2) tomcat/conf/Catalina/localhost/context.xml 當前虛擬主機(localhost)下所有工程都可以使用該連接池

3) 當前工程/META-INF/context.xml(文件名不能變) 只有當前工程可以訪問該連接池


<Context>

 <Resource name="jdbc/EmployeeDB"

           auth="Container"

           type="javax.sql.DataSource"

           username="root" password="abc"

           driverClassName="com.mysql.jdbc.Driver"                url="jdbc:mysql:///day14"

           maxActive="8" maxIdle="4"/>

</Context>


* 必須先將mysql驅動jar包 複製tomcat/lib下

* 在tomcat啓動服務器時,創建連接池對象,綁定 jdbc/EmployeeDB 指定名稱上


2、通過運行在JNDI容器內部的程序(Servlet/JSP)去訪問tomcat內置連接池

Context context = new InitialContext();

Context envCtx = (Context)context.lookup("java:comp/env"); 固定路徑,JBDI的名字

DataSource datasource = (DataSource) envCtx.lookup("jdbc/EmployeeDB"); 通過綁定名稱,查找指定java對象




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章