Hinernate中得到數據庫鏈接池的方式及應用

       Hibernate能夠與任何一種java應用的運行環境集成。Java應用的運行環境可分爲兩種。
      (1)受管理環境(Managed environment):由容器負責管理各類共享資源(如線程池和數據庫鏈接池),以及管理事務和安全。如JBoss、WebLogic和WebSphere等J2EE應用服務器都提供了符合J2EE規範的受管理環境。
      (2)不受管理環境(Non-managed environment):由應用自己負責管理數據庫鏈接、定義事務邊界以及管理安全。獨立的桌面應用或命令行應用都運行在不受管理環境中。Servlet容器會負責管理線程池,如tomcat容器還會管理數據庫鏈接池,可是Servlet容器不會管理事務,所以它提供的仍然是不受管理的運行環境。java

Hinernate中得到數據庫鏈接池的方式
1.使用默認的數據庫鏈接池
  Hibernate提供了默認的鏈接池實現,實現類爲DriverManagerConnectionProvider。如在Hibernate配置文件中沒有明確配置任何鏈接池,就會使用這個默認的鏈接池。
  默認鏈接池的hibernate.properties文件
  Hibernate.dialect=net.sf.hibernate.dialect.MySQLDialect
  Hibernate.connection.driver_class=com.mysql.jdbc.Driver
  Hibernate.connection.url=jdbc:mysql://localhost:3306/SAMPLEDB
  Hibernate.connection.username=root
  Hibernate.connection.password=1234
  Hibernate.show_sql=true
注:實際開發中不多用到默認的鏈接池,因其缺少大批量併發請求以及容錯的能力。
2.使用配置文件指定的數據庫鏈接池
  這種方式能夠在配置文件中顯式配置特定的數據庫鏈接池,Hibernate負責構造這種鏈接池,而後經過它得到數據庫的鏈接。Hibernate支持的第三方鏈接池產品爲:C3P0、Proxool和DBCP。
  C3P0的配置如:
  Hibernate.dialect=net.sf.hibernate.dialect.MySQLDialect
  Hibernate.connection.driver_class=com.mysql.jdbc.Driver
  Hibernate.connection.url=jdbc:mysql://localhost:3306/SAMPLEDB
  Hibernate.connection.username=root
  Hibernate.connection.password=1234
  Hibernate.show_sql=true
  Hibernate.c3p0.min_size=5
  Hibernate.c3p0.max_size=20
  Hibernate.c3p0.timeout=300
  Hibernate.c3p0.max_statements=50
  Hibernate.c3p0.idle_test_period=3000
  
  這種方式在項目中的使用:
  項目中是經過jndi方式進行配置的
  如jndi.xml裏的配置爲:
  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
  <beans>
    <bean id="jndi" class="org.apache.xbean.spring.jndi.DefaultContext">
      <property name="entries">
        <map>      
          <entry key="jdbc/soaware">
            <bean class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" singleton="false">
              <property name="driverClass" value="com.mysql.jdbc.Driver" />
              <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/soaware" />
              <property name="user" value="root" />
              <property name="password" value="root" />
              <property name="initialPoolSize" value="1" />
              <property name="minPoolSize" value="1" />
              <property name="acquireIncrement" value="5" />
              <property name="maxPoolSize" value="20" />
              <property name="maxIdleTime" value="300" />
              <property name="loginTimeout" value="500" />
            </bean>
          </entry>
    </map>
      </property>
    </bean>
  </beans>
  
  經過這種方式讓hibernate來維護數據庫的鏈接池,在應用程序或其餘配置文件中能夠經過JNDI名字來得到對應的數據源。

3.從容器中得到數據源
       在不受管理環境中,有些Servlet容器,如Tomcat,也能負責構造數據源,並能把它發佈爲JNDI資源,所以Hibernate也能從Tomcat容器中得到數據源。
  Tomcat中,爲了使hibernate從容器中得到數據源,須要分別配置tomcat容器和hibernate:
  (1)在tomcat容器中配置數據源
  在tomcat 的配置文件server.xml中,<Resource>元素用來配置JNDI資源,tomcat容許把數據源也發佈爲JNDI資源,以下面的server.xml中配置了一個JNDI名爲「jdbc/SAMPLEDB」的數據源。
  
  <Resource  name="jdbc/SAMPLEDB" auth="Container"
                type="javax.sql.DataSource"              
    </GlobalNamingResources>  
  <ResourceParams name = "jdbc/SAMPLEDB">
     <parameter>
       <name>factory</name>
       <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
     </parameter>
    <parameter>
       <name>maxActive</name>
       <value>100</value>
     </parameter>
    <parameter>
       <name>maxIdle</name>
       <value>30</value>
     </parameter>
    <parameter>
       <name>maxWait</name>
       <value>10000</value>
     </parameter>
    <parameter>
       <name>username</name>
       <value>root</value>
     </parameter>
    <parameter>
       <name>password</name>
       <value>1234</value>
     </parameter>
     <parameter>
       <name>driverClassName</name>
       <value>com.mysql.jdbc.Driver</value>
      </parameter>
      <parameter>
        <name>url</name>
        <value>jdbc:mysql://localhost:3306/SAMPDB?autoReconnect=true</value>
       </parameter>
     </ResourceParams>
  </Context>
  
     </ResourceParams>元素的factory參數指定了這個鏈接池的工廠類爲:org.apache.commons.dbcp.BasicDataSourceFactory。Tomcat容器將經過這個工廠類來構造javax.sql.DataSource實例,而後把它發佈爲JNDI資源,JNDI名字爲「jdbc/SAMPLEDB」。
  
   (2)在hibernate的配置文件中指定使用容器中的數據源
     在hibernate的配置文件中,hibernate.connection.datasource屬性用於指定容器中的數據源。以下面的代碼指定了Hibernate使用容器中JNDI爲「jdbc/SAMPLEDB」的數據源。
  Hibernate.dialect=net.sf.hibernate.dialect.MySQLDialect
  Hibernate.connection.datasource=java:comp/env/jdbc/SAMPLEDB
  Hibernate.show_sql=true
  
      指定數據源時,須提供完整的JNDI名字。因爲hibernate直接從容器中得到現成的數據源,所以在hibernate的配置文件中,無須設定如下的鏈接數據庫的屬性:
  Hibernate.connection.url
  Hibernate.connection.username
  Hibernate.connection.password
  
  這種實現方式在項目中的使用,以tomcat的爲例:
  (1)在tomcat下的conf/context.xml文件中的配置如:
      <Resource name="jdbc/soaware" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="root" password="root" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/soaware_gansu?autoReconnect=true" />
  這一步爲在tomcat容器中配置了數據源。
  (2)在實際項目下的datasource.xml配置文件
      <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
          <property name="jndiName" value="java:comp/env/jdbc/soaware" />
          <property name="lookupOnStartup" value="false" />
          <property name="cache" value="true" />
          <property name="proxyInterface" value="javax.sql.DataSource" />
      </bean>
  這一步完成的是hibernate經過JNDI名字得到tomcat容器中的數據源。
  
4.由Java應用自己提供數據庫鏈接
       Java應用經過hibernate訪問數據庫時,先調用SessionFactory的openSession()方法得到一個Session實例,而後經過Session實例執行具體的數據操做。對於每個Session實例,Hibernate都會爲它分配一個數據庫鏈接。默認下hibernate從數據庫鏈接池中得到可用的數據庫鏈接。此外hibernate還容許由應用程序爲Session指定數據庫鏈接。SessionFactory的openSession()方法有如下重載形式。
(1)openSession():由hibernate從數據庫鏈接池中得到可用的數據庫鏈接
(2)openSession(Connection connection):由應用程序提供數據庫鏈接mysql

相關文章
相關標籤/搜索