hibernate 数据源配置文件
來源:http://blog.csdn.net/happyangelling/archive/2010/09/06/5866981.aspx
?
/**
*數據源(mysql、sqlserver、oracle)+數據源信息配置(jndi、properties、xml)+數據源信息讀取(jdbc、spring、hibernate)
*本文件總結了mysql,sqlserver,oracle三種數據源的連接方式
*其中包括Spring、Hibernate的連接方式
*并通過屬性文件、JNDI、配置文件三種方式進行連接
*/
1.通過屬性文件?讀取數據源配置
--jdbc.properties
1)mysql?
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncodeing=utf-8
jdbc.username=root
jdbc.password=123456
2)sqlserver?
jdbc.driverClassName=net.sourceforge.jtds.jdbc.Driver
jdbc.url=jdbc:jtds:sqlserver://localhost:1433/test
jdbc.username=sa
jdbc.password=sa
3)oracle?
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:orcale:thin://localhost:1521/nquser
jdbc.username=wapcms
jdbc.password=wapcms
--Spring-applicationContext-data.xml?
<beans>
??? <bean id="dataSource"
??? ??? class="org.springframework.jdbc.datasource.DriverManagerDataSource">
??? ??? <property name="driverClassName"
??? ??? ??? value="${jdbc.driverClassName}" />
??? ??? <property name="url" value="${jdbc.url}" />
??? ??? <property name="username" value="${jdbc.username}" />
??? ??? <property name="password" value="${jdbc.password}" />
??? </bean>
??? <bean id="propertyConfigurer"
??? ??? class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
??? ??? <property name="locations">
??? ??? ??? <list>
??? ??? ??? ??? <value>classpath:jdbc.properties</value>
??? ??? ??? </list>
??? ??? </property>
??? </bean>
??? <!-- 設定transactionManager -->
??? <bean id="transactionManager"
??? ??? class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
??? ??? <property name="dataSource" ref="dataSource" />
??? </bean>
????
??? <tx:annotation-driven/>
</beans>
2.用JNDI?讀取數據源server.xml?
在<GlobalNamingResources>標簽元素下填加
1)mysql?
<Resource name="jdbc/mysqlonline" type="javax.sql.DataSource"
??? driverClassName="com.mysql.jdbc.Driver"
??? password="123456"
??? maxIdle="30"
??? maxWait="10000"?
??? username="root"
??? url="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=gb2312
??? maxActive="100" />
2)orcale?
<Resource name="jdbc/wapcms"? type="javax.sql.DataSource"
??? driverClassName="oracle.jdbc.driver.OracleDriver"
??? password="123456"
??? maxIdle="30"
??? maxWait="10000"
??? username="root"
??? url="jdbc:oracle:thin:@localhost:1521:nquser"
??? maxActive="100"
??? removeAbandoned="true"
??? removeAbandonedTimeout="300"
??? logAbandoned="true"/>
3)sqlserver?
<Resource name="jdbc/user"? type="javax.sql.DataSource"
??? driverClassName="net.sourceforge.jtds.jdbc.Driver"
??? password="sa"
??? maxIdle="30"
??? maxWait="10000"
??? username="sa"
??? url="jdbc:jtds:sqlserver://localhost:1433/test"
??? maxActive="100"
??? removeAbandoned="true"
??? removeAbandonedTimeout="300"
??? logAbandoned="true"/>
在<Host>下
??? <Context path="" docBase="E:/WAP/WAP_CMS/WebContent"
??? ??? debug="0" reloadable="true" privileged="true" crossContext="true"
??? ??? useNaming="true">
??? ??? <ResourceLink name="jdbc/wapcms" global="jdbc/wapcms" type="javax.sql.DataSource" />
??? ??? <ResourceLink name="jdbc/mysqlonline" global="jdbc/mysqlonline" type="javax.sql.DataSource" />
??? </Context>
</Host>
--web.xml?
<resource-ref>
??? <description>DB Connection</description>
??? <res-ref-name>jdbc/wapcms</res-ref-name>
??? <res-type>javax.sql.DataSource</res-type>
??? <res-auth>Container</res-auth>
</resource-ref>
--Spring-application-data.xml?
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
??? <property name="jndiName">
??? ??? <value>java:comp/env/jdbc/wapcms</value>
??? </property>
</bean>
<!-- 設定transactionManager -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
??? <property name="dataSource" ref="dataSource" />
</bean>
3.用配置文件?讀取數據源信息
---hibernate.cfg.xml?
<hibernate-configuration>
??? <session-factory>
??????? <!-- Database connection settings -->
??????? <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
??????? <property name="connection.url">jdbc:oracle:thin:@localhost:1521:ora</property>
??????? <property name="connection.username">koooso</property>
??????? <property name="connection.password">koooso</property>
??????? <!-- JDBC connection pool (use the built-in) -->
??????? <property name="connection.pool_size">5</property>
??????? <!-- 注意如果是運行在application中時,必須要有current_session_context_class這個屬性,且值為
?????? thread。如果是運行在WEB服務器中則需要將值設置成jta。否則在運行時會報Exception?
?????? in thread "main" org.hibernate.HibernateException: No CurrentSessionContext configured! 這個異常-->
?????? <property name="current_session_context_class">jta</property>
??????? <!-- Echo all executed SQL to stdout -->
??????? <property name="show_sql">true</property>
??????? <!-- SQL dialect -->
??????? <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
??????? <!-- Drop and re-create the database schema on startup -->
??????? <property name="hbm2ddl.auto">create</property>
??????? <mapping resource="com/chinamworld/hibernate/tf/MyTest.hbm.xml"/>
??? </session-factory>
</hibernate-configuration>
?
---sqlserver Spring?
<bean id="dataSource"
?? class="org.apache.commons.dbcp.BasicDataSource">
?? <property name="driverClassName"
??? value="net.sourceforge.jtds.jdbc.Driver">
?? </property>
?? <property name="url"
??? value="jdbc:jtds:sqlserver://localhost:1433/test">
?? </property>
?? <property name="username" value="sa"></property>
?? <property name="password" value="admin"></property>
</bean>
<!-- 將Hibernate交由Spring管理(Hibernate相關配置信息) ,創建SessionFactory-->
<bean id="sessionFactory"
?? class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
?? <property name="dataSource">
??? <ref bean="dataSource" />
?? </property>
?? <property name="hibernateProperties">
??? <props>
???? <prop key="hibernate.dialect">
????? org.hibernate.dialect.SQLServerDialect
???? </prop>
???? <prop key="hibernate.show_sql">true</prop>
??? </props>
?? </property>
?? <property name="mappingResources">
??? <list>
???? <value>com/wuwei/struts/dao/User.hbm.xml</value>
??? </list>
?? </property>
</bean>
4.多種數據源配置?
<!--?DBCP data source?-->
<!--?
<bean id="dataSource"
?? class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
?? <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
?? <property name="defaultAutoCommit" value="false"></property>
?? <property name="maxActive" value="50"></property>
?? <property name="url" value="jdbc:mysql://localhost:3306/exam"></property>
?? <property name="username" value="root"></property>
?? <property name="password" value=""></property>
?? <property name="password" value="true"></property>
?? <property name="password" value="true"></property>
?? <property name="password" value="180"></property>
</bean>
?? -->
<!--?C3P0 data source?-->
<bean id="dataSource"
?? class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
?? <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
?? <property name="autoCommitOnClose" value="false"></property>
?? <property name="maxIdleTime" value="1800"></property> <!-- 最大空閑時間,1800秒內未使用則連接被丟棄。若為0則永不丟棄 -->
?? <property name="maxPoolSize" value="50"></property>
?? <property name="initialPoolSize" value="5"></property>
?? <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/exam"></property>
?? <property name="user" value="root"></property>
?? <property name="password" value=""></property>
</bean>
<!--?JNDI data source?-->
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
??? <property name="jndiName">
??? ??? <value>java:comp/env/jdbc/wapcms</value>
??? </property>
</bean>
<!--?Hibernate sessionFactory?-->
<bean id="sessionFactory"
?? class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
?? <property name="dataSource">
??? <ref bean="dataSource" />
?? </property>
?? <property name="hibernateProperties">
??? <props>
???? <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
???? <prop key="hibernate.show_sql">true</prop>
??? </props>
?? </property>
?? <property name="mappingResources">
??? <list>
??? <value>com/brady/exam/model/Grade.hbm.xml</value>
??? <value>com/brady/exam/model/Paper.hbm.xml</value>
??? <value>com/brady/exam/model/Test.hbm.xml</value>
??? <value>com/brady/exam/model/Subject.hbm.xml</value>
??? </list>
?? </property>
</bean>
<!-- Tranasction Manager -->
<bean id="transactionManager"
?? class="org.springframework.orm.hibernate3.HibernateTransactionManager">
?? <property name="sessionFactory">
??? <ref bean="sessionFactory" />
?? </property>
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
?? <tx:attributes>
??? <tx:method name="insert*" propagation="REQUIRED"/>
??? <tx:method name="edit*" propagation="REQUIRED"/>
??? <tx:method name="save*" propagation="REQUIRED"/>
??? <tx:method name="update*" propagation="REQUIRED"/>
??? <tx:method name="merge*" propagation="REQUIRED"/>
??? <tx:method name="remove*" propagation="REQUIRED"/>
??? <tx:method name="delete*" propagation="REQUIRED"/>
??? <tx:method name="find*" read-only="true"/>?
??? <tx:method name="get*" read-only="true"/>?
?? </tx:attributes>
</tx:advice>
<aop:config>
?? <aop:pointcut id="daoPointcut"
??? expression="execution(* com.brady.exam.dao.*.*(..))"/>
?? <aop:advisor advice-ref="txAdvice" pointcut-ref="daoPointcut"/>
</aop:config>
<!-- End Tranasction Manager -->
<bean id="userDAO" class="com.brady.exam.dao.impl.hibernate.UserDAO">
?? <property name="sessionFactory">
??? <ref bean="sessionFactory" />
?? </property>
</bean>
<bean id="basicDAO" class="com.brady.exam.dao.impl.hibernate.BasicDAO">
?? <property name="sessionFactory">
??? <ref bean="sessionFactory" />
?? </property>
</bean>
</beans>
1、關于數據源
在resin中通過jndi配置的名稱為jdbc/dbp,并且這個名稱是固定死的(我自己配置的時候配置成jdbc/webcl,所以一直連不上),為 什么這個名字是死的呢,是因為原來寫數據庫連接池的時候,這個連接名稱是在程序中寫死的。在 vschool.pubbean.ConnectionProxy中createConnection()方法中有
if( pool == null )
??? ??{
???? ??Context env = new InitialContext();
????????? pool = (DataSource) env.lookup("java:comp/env/jdbc/dbp");//此處名字寫死了
????????? if (pool == null)
???????????????? throw new SQLException("unknown DataSource");
???????? }
???????? return pool.getConnection();?
不過在一個項目中數據源是死的,所以這里這樣寫是合理的。那么這個連接池在什么地方用到了呢。在index.jsp中,剛訪問頁面時第一句話 theSystem.setConnection(con); theSystem.load();這個load方法應該是讀取系統狀態的信息,這些信息存在于T_SystemState表中。這里就會發現需要連接數 據庫了,那么肯定就得用連接池了。果然第一句話就是ConnectionProxy.getConnection()。通過自己寫的連接池方法來獲得連 接,這個連接如果有就取出來,如果沒有就通過上面的方法創建,這個時候就用到了數據源了。
所以可以看到webcl數據源的配置完全因為以前使用自己寫的連接池來調用數據庫,而設置。跟以后用到的hibernate沒有關系(當然可以設置成有關系)。
2、關于hibernate配置
hibernate的數據連接池有四種方法
第一。通過默認的數據連接池你只需要在hibernate默認配置文件中配置dialect,driver_class,url,username,password,show_sql這類屬性就可以了,默認提供一個連接池,但是這個連接池據說非常的爛。所以不推薦使用。
第二、使用配置文件指定 數據庫連接池。
hibernate默認支持三種連接池產品:C3P0,Proxool,DBCP,以C3P0為列的配置如下
第一中的配置加上,然后再加上c3po.min_size,max_size,timeout,max_statements,idle_test_period等連接池的屬性。hibernate就會根據這個連接池來獲得數據庫鏈接。
第三、從容器中獲得數據源
例如tomcat中在tomcat的context中配置數據源,然后在hibernate的配置文件中加上 dialect,connection.datasource,show_sql屬性,其中最關鍵的就是connection.datasource這個 路徑是jndi名稱。這里無需配置數據庫連接的用戶名密碼之類。
第四、通過java程序提供數據庫連接。
在使用hibernate之前,先調用SessionFactory.openSession()獲得session后,通過session來操作數據 庫。問題是怎么創建session,這可以重載SessionFactory的兩個方法 openSession(),openSession(Connection conn)第一種方法使用提供的數據庫連接池來獲得數據庫連接,第二種則程序來實現獲得數據庫連接可以是直接的通過DriveManager獲得,也可以 通過訪問數據源來獲得,
所以看到hibernate的與數據源的關系完全是看自己怎么設計了。還有值得提的是webcl之前每一次執行數據庫操作之前,都需要對 hibernate的配置屬性進行初始化一次,這個初始化不僅將屬性讀進去,還初始化了SessionFactory等hibernate必須的初始化, 后來師兄想到了方法就是將這個初始化工作放在了啟動容器中,對,就是放在web.xml中的過濾里面。但是這提醒了一點,在使用 SessionFactory之前,必須要初始化的。
還有為什么hibernate的配置文件是hibernate.cfg.xml呢,大家應該也都知道是默認配置,那么可不可以是別的文件名呢,答案是可以 的。在上面提到的initialize方法中(在net.vschool.hibernate.base._BaseRootDAO這個應該是 hibernate自動生成的)有initialize (),也有initialize (String configFileName)第一個就是使用默認的hibernate配置文件(hibernate.properties或者 hibernate.cfg.xml),第二個方法就可以傳入自定義的hibernate的配置文件路徑。
總結
以上是生活随笔為你收集整理的hibernate 数据源配置文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3DsMax2013中文版快捷键大汇总
- 下一篇: 静态路由(静态汇总路由,静态默认路由,负