spring数据源的几种配置

来源:互联网 发布:clean my mac 怎么样 编辑:程序博客网 时间:2024/05/01 08:57
<pre name="code" class="html">一、使用jndi,数据库驱动跟数据源隔离spring-dataSource.xml配置如下<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">  <property name="jndiName">  <value>java:comp/env/test</value>  </property> </bean><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.Oracle10gDialect    </prop><!-- <prop key="hibernate.query.factory_class">     org.hibernate.hql.classic.ClassicQueryTranslatorFactory    </prop>-->    <prop key="hibernate.show_sql">false</prop>      <prop key="hibernate.format_sql">false</prop>   </props>  </property>  <property name="mappingResources">   <list>    <value>csdc/bean/ProjectApplication.hbm.xml</value>    <value>csdc/bean/ProjectApplicationReview.hbm.xml</value>    <value>csdc/bean/ProjectApplicationReviewUpdate.hbm.xml</value>    <value>csdc/bean/Expert.hbm.xml</value>       </list>  </property> </bean>tomcat content.xml配置:<Resource  name="test"  auth="Container"  type="javax.sql.DataSource"  driverClassName="oracle.jdbc.driver.OracleDriver"  url="jdbc:oracle:thin:@192.168.88.220:1521:orcl"  username="test"  password="123456"  maxActive="20"  maxIdle="10"  maxWait="-1"/>


web.xml配置如下:
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">  <context-param>    <param-name>contextConfigLocation</param-name>    <param-value>classpath:applicationContext.xml</param-value>  </context-param>  <filter>    <filter-name>CharacterEncodingFilter</filter-name>    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>    <init-param>      <param-name>encoding</param-name>      <param-value>UTF-8</param-value>    </init-param>    <init-param>      <param-name>forceEncoding</param-name>      <param-value>true</param-value>    </init-param>  </filter>  <filter>    <filter-name>springSecurityFilterChain</filter-name>    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>  </filter>  <filter>    <filter-name>struts2</filter-name>    <filter-class>csdc.tool.filter.MyStrutsFilter</filter-class>  </filter>  <filter>    <filter-name>struts-execute</filter-name>    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter</filter-class>  </filter>  <filter-mapping>    <filter-name>CharacterEncodingFilter</filter-name>    <url-pattern>/*</url-pattern>  </filter-mapping>  <filter-mapping>    <filter-name>springSecurityFilterChain</filter-name>    <url-pattern>/*</url-pattern>  </filter-mapping>  <filter-mapping>    <filter-name>struts2</filter-name>    <url-pattern>/*</url-pattern>  </filter-mapping>  <filter-mapping>    <filter-name>struts-execute</filter-name>    <url-pattern>/*</url-pattern>  </filter-mapping>  <listener>    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  </listener>  <listener>    <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>  </listener>  <listener>    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>  </listener>  <listener>    <listener-class>csdc.tool.listener.StartUpListener</listener-class>  </listener>  <listener>    <listener-class>csdc.tool.listener.SessionListener</listener-class>  </listener>  <servlet>    <servlet-name>ConnectorServlet</servlet-name>    <servlet-class>csdc.tool.fckeditor.ConnectorServlet</servlet-class>    <init-param>      <param-name>baseDir</param-name>      <param-value>/upload/news/</param-value>    </init-param>    <load-on-startup>1</load-on-startup>  </servlet>  <servlet>    <servlet-name>dwr-invoker</servlet-name>    <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>    <init-param>      <param-name>debug</param-name>      <param-value>true</param-value>    </init-param>    <init-param>      <param-name>config</param-name>      <param-value>/WEB-INF/config/dwr.xml</param-value>    </init-param>    <init-param>      <param-name>logLevel</param-name>      <param-value>warn</param-value>    </init-param>    <init-param>      <param-name>crossDomainSessionSecurity</param-name>      <param-value>false</param-value>    </init-param>    <load-on-startup>1</load-on-startup>  </servlet>  <servlet-mapping>    <servlet-name>ConnectorServlet</servlet-name>    <url-pattern>/tool/fckeditor/editor/filemanager/connectors/*</url-pattern>  </servlet-mapping>  <servlet-mapping>    <servlet-name>dwr-invoker</servlet-name>    <url-pattern>/dwr/*</url-pattern>  </servlet-mapping>  <session-config>    <session-timeout>60</session-timeout>  </session-config>  <welcome-file-list>    <welcome-file>/welcome.jsp</welcome-file>  </welcome-file-list>  <login-config>    <auth-method>BASIC</auth-method>  </login-config>  <span style="color:#ff6666;"><resource-ref>    <description>Oracle JNDI Datasource</description>    <res-ref-name>smas</res-ref-name>    <res-type>javax.sql.DataSource</res-type>    <res-auth>Container</res-auth>  </resource-ref></span></web-app>




二、数据源中配置驱动
<bean id="dataSource"  class="org.springframework.jdbc.datasource.DriverManagerDataSource">  <property name="driverClassName" value="com.mysql.jdbc.Driver" />  <property name="url" value="jdbc:mysql://192.168.88.220/hsasdb" />  <property name="username" value="test" />  <property name="password" value="123456" /> </bean><bean id="sessionFactory"  class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">  <property name="dataSource">   <ref bean="dataSource" />  </property>  <property name="hibernateProperties">   <props>    <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>    <prop key="hibernate.show_sql">false</prop> <prop key="hibernate.format_sql">false</prop><!-- <prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</prop>    <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>    <prop key="hibernate.cache.use_query_cache">true</prop>    <prop key="hibernate.jdbc.fetch_size">50</prop> -->    <prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>        </props>  </property>  <property name="packagesToScan">   <list>    <value>csdc.model</value>   </list>  </property> </bean><bean id="baseDao" class="csdc.dao.HibernateBaseDao">  <property name="sessionFactory">   <ref bean="sessionFactory" />  </property> </bean>



三、jdbcTemplate 配置,直接使用底层的jdbc

<!-- 自定义jdbcDao的依赖 --><bean id="jdbcDao" class ="csdc.dao.JdbcDao"><property name="jdbcTemplate"><ref bean="jdbcTemplate"/></property></bean><!--依赖jdbcTemplate的数据源  --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource"><ref bean="smdbDataSource"/></property><property name=""></property></bean><bean id="smdbDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <!--org.apache.commons.dbcp.BasicDataSource--><property name="driverClassName" value="oracle.jdbc.OracleDriver" /><property name="url" value="jdbc:oracle:thin:@192.168.88.220:1521:orcl" /><property name="username" value="smdbtest" /><property name="password" value="p1013smdbtest702" /></bean> 


相应的jbdcdao.java
public class JdbcDao {    private JdbcTemplate jdbcTemplate;    public List<String[]> query(String sql) {    return jdbcTemplate.query(sql, new ResultSetExtractor<List<String[]>>() {public List<String[]> extractData(ResultSet rs) throws SQLException {int columnNumber = rs.getMetaData().getColumnCount();List res = new ArrayList();while(rs.next()) {String[] objs = new String[columnNumber];for (int i = 0; i < columnNumber; i++) {objs[i] = rs.getString(i + 1);}res.add(objs);}return res;}});    }    //依赖注入public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}            // JDBC-backed implementations of the methods on the CorporateEventDao follow...}
具体的封装在org.springframework.jdbc.core.JdbcTemplate类中。其中JdbcTemplate继承JdbcAccessor 

package org.springframework.jdbc.support;import javax.sql.DataSource;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.springframework.beans.factory.InitializingBean;public abstract class JdbcAccessor implements InitializingBean {protected final Log logger = LogFactory.getLog(getClass());private DataSource dataSource;//dataSource属性,配置bean,setter注入private SQLExceptionTranslator exceptionTranslator;private boolean lazyInit = true;public void setDataSource(DataSource dataSource) {this.dataSource = dataSource;}public DataSource getDataSource() {return this.dataSource;}public void setDatabaseProductName(String dbName) {this.exceptionTranslator = new SQLErrorCodeSQLExceptionTranslator(dbName);}public void setExceptionTranslator(SQLExceptionTranslator exceptionTranslator) {this.exceptionTranslator = exceptionTranslator;}public synchronized SQLExceptionTranslator getExceptionTranslator() {if (this.exceptionTranslator == null) {DataSource dataSource = getDataSource();if (dataSource != null) {this.exceptionTranslator = new SQLErrorCodeSQLExceptionTranslator(dataSource);}else {this.exceptionTranslator = new SQLStateSQLExceptionTranslator();}}return this.exceptionTranslator;}public void setLazyInit(boolean lazyInit) {this.lazyInit = lazyInit;}public boolean isLazyInit() {return this.lazyInit;}public void afterPropertiesSet() {if (getDataSource() == null) {throw new IllegalArgumentException("Property 'dataSource' is required");}if (!isLazyInit()) {getExceptionTranslator();}}}






package org.springframework.jdbc.core;public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {private static final String RETURN_RESULT_SET_PREFIX = "#result-set-";private static final String RETURN_UPDATE_COUNT_PREFIX = "#update-count-";private NativeJdbcExtractor nativeJdbcExtractor;private boolean ignoreWarnings = true;private int fetchSize = 0;private int maxRows = 0;private int queryTimeout = 0;private boolean skipResultsProcessing = false;private boolean skipUndeclaredResults = false;private boolean resultsMapCaseInsensitive = false;public JdbcTemplate() {}public JdbcTemplate(DataSource dataSource) {setDataSource(dataSource);afterPropertiesSet();}public JdbcTemplate(DataSource dataSource, boolean lazyInit) {setDataSource(dataSource);setLazyInit(lazyInit);afterPropertiesSet();}//***********//public <T> T execute(ConnectionCallback<T> action) throws DataAccessException {Assert.notNull(action, "Callback object must not be null");Connection con = DataSourceUtils.getConnection(getDataSource());try {Connection conToUse = con;if (this.nativeJdbcExtractor != null) {// Extract native JDBC Connection, castable to OracleConnection or the like.conToUse = this.nativeJdbcExtractor.getNativeConnection(con);}else {// Create close-suppressing Connection proxy, also preparing returned Statements.conToUse = createConnectionProxy(con);}return action.doInConnection(conToUse);}catch (SQLException ex) {// Release Connection early, to avoid potential connection pool deadlock// in the case when the exception translator hasn't been initialized yet.DataSourceUtils.releaseConnection(con, getDataSource());con = null;throw getExceptionTranslator().translate("ConnectionCallback", getSql(action), ex);}finally {DataSourceUtils.releaseConnection(con, getDataSource());}}protected Connection createConnectionProxy(Connection con) {return (Connection) Proxy.newProxyInstance(ConnectionProxy.class.getClassLoader(),new Class[] {ConnectionProxy.class},new CloseSuppressingInvocationHandler(con));}public <T> T execute(StatementCallback<T> action) throws DataAccessException {Assert.notNull(action, "Callback object must not be null");Connection con = DataSourceUtils.getConnection(getDataSource());Statement stmt = null;try {Connection conToUse = con;if (this.nativeJdbcExtractor != null &&this.nativeJdbcExtractor.isNativeConnectionNecessaryForNativeStatements()) {conToUse = this.nativeJdbcExtractor.getNativeConnection(con);}stmt = conToUse.createStatement();applyStatementSettings(stmt);Statement stmtToUse = stmt;if (this.nativeJdbcExtractor != null) {stmtToUse = this.nativeJdbcExtractor.getNativeStatement(stmt);}T result = action.doInStatement(stmtToUse);handleWarnings(stmt);return result;}catch (SQLException ex) {// Release Connection early, to avoid potential connection pool deadlock// in the case when the exception translator hasn't been initialized yet.JdbcUtils.closeStatement(stmt);stmt = null;DataSourceUtils.releaseConnection(con, getDataSource());con = null;throw getExceptionTranslator().translate("StatementCallback", getSql(action), ex);}finally {JdbcUtils.closeStatement(stmt);DataSourceUtils.releaseConnection(con, getDataSource());}}public <T> T query(final String sql, final ResultSetExtractor<T> rse) throws DataAccessException {Assert.notNull(sql, "SQL must not be null");Assert.notNull(rse, "ResultSetExtractor must not be null");if (logger.isDebugEnabled()) {logger.debug("Executing SQL query [" + sql + "]");}class QueryStatementCallback implements StatementCallback<T>, SqlProvider {public T doInStatement(Statement stmt) throws SQLException {ResultSet rs = null;try {rs = stmt.executeQuery(sql);ResultSet rsToUse = rs;if (nativeJdbcExtractor != null) {rsToUse = nativeJdbcExtractor.getNativeResultSet(rs);}return rse.extractData(rsToUse);}finally {JdbcUtils.closeResultSet(rs);}}public String getSql() {return sql;}}return execute(new QueryStatementCallback());}<pre name="code" class="html"><span style="white-space:pre"></span>private static class RowCallbackHandlerResultSetExtractor implements ResultSetExtractor<Object> {private final RowCallbackHandler rch;public RowCallbackHandlerResultSetExtractor(RowCallbackHandler rch) {this.rch = rch;}public Object extractData(ResultSet rs) throws SQLException {while (rs.next()) {this.rch.processRow(rs);}return null;}}

}




0 0
原创粉丝点击