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 |