Hinernate中获得数据库连接池的方式及应用

       Hibernate可以与任何一种java应用的运行环境集成。Java应用的运行环境可分为两种。
      (1)受管理环境(Managed environment):由容器负责管理各种共享资源(如线程池和数据库连接池),以及管理事务和安全。如JBoss、WebLogic和WebSphere等J2EE应用服务器都提供了符合J2EE规范的受管理环境。
      (2)不受管理环境(Non-managed environment):由应用本身负责管理数据库连接、定义事务边界以及管理安全。独立的桌面应用或命令行应用都运行在不受管理环境中。Servlet容器会负责管理线程池,如tomcat容器还会管理数据库连接池,但是Servlet容器不会管理事务,因此它提供的仍然是不受管理的运行环境。

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):由应用程序提供数据库连接

你可能感兴趣的:(Hinernate中获得数据库连接池的方式及应用)